instalar como c++ opencv archlinux

c++ - como - opencv python spyder



¿No se puede compilar OpenCV debido a referencias no definidas? (5)

El código es simple y es esencialmente directo de this tutorial. Estoy ejecutando Arch Linux y tengo la biblioteca OpenCV almacenada en /usr/include/ . También me he asegurado de que /usr/include esté en mi RUTA.

#include <opencv/cv.h> #include <opencv/highgui.h> #include <iostream> using namespace cv; int main(int argc, char** argv){ Mat image; Mat grayImage; if(!argv[1]){ std::cerr << "No image data!" << std::endl; return -1; } image = imread(argv[1], 1); cvtColor(image, grayImage, CV_BGR2GRAY); imwrite("Gray_Image.jpg", grayImage); namedWindow(argv[1], CV_WINDOW_AUTOSIZE); namedWindow("Gray Image", CV_WINDOW_AUTOSIZE); imshow(argv[1], image); imshow("Gray Image", grayImage); waitKey(0); return 0; }

El proceso del compilador encuentra e incluye estos archivos de encabezado con éxito, pero todavía recibo errores de referencia indefinidos en tiempo de compilación. Si observa los archivos de encabezado que /usr/include/opencv2 , también incluyen otros archivos en /usr/include/opencv2 . He comprobado y tales archivos de cabecera existen.

¿Algunas ideas?

/tmp/ccudBcqD.o: In function `main'': test.cpp:(.text+0xc0): undefined reference to `cv::imread(std::string const&, int)'' test.cpp:(.text+0x11f): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'' test.cpp:(.text+0x138): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'' test.cpp:(.text+0x158): undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'' test.cpp:(.text+0x180): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'' test.cpp:(.text+0x1ca): undefined reference to `cv::imwrite(std::string const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'' test.cpp:(.text+0x241): undefined reference to `cv::namedWindow(std::string const&, int)'' test.cpp:(.text+0x291): undefined reference to `cv::namedWindow(std::string const&, int)'' test.cpp:(.text+0x2bf): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'' test.cpp:(.text+0x2ff): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'' test.cpp:(.text+0x32d): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'' test.cpp:(.text+0x361): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'' test.cpp:(.text+0x383): undefined reference to `cv::waitKey(int)'' /tmp/ccudBcqD.o: In function `cv::Mat::~Mat()'': test.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'' /tmp/ccudBcqD.o: In function `cv::Mat::operator=(cv::Mat const&)'': test.cpp:(.text._ZN2cv3MataSERKS0_[_ZN2cv3MataSERKS0_]+0x111): undefined reference to `cv::Mat::copySize(cv::Mat const&)'' /tmp/ccudBcqD.o: In function `cv::Mat::release()'': test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): undefined reference to `cv::Mat::deallocate()'' collect2: error: ld returned 1 exit status [Finished in 1.1s with exit code 1] [shell_cmd: g++ "/home/branden/Desktop/OpenCV/test.cpp" -o "/home/branden/Desktop/OpenCV/test"] [dir: /home/branden/Desktop/OpenCV] [path: /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl]


Este es un problema de vinculador. Tratar:

g++ -o test_1 test_1.cpp `pkg-config opencv --cflags --libs`

Esto debería funcionar para compilar la fuente. Sin embargo, si recientemente compiló OpenCV desde la fuente, se encontrará con un problema de vinculación en el tiempo de ejecución, no se encontrará la biblioteca. En la mayoría de los casos, después de compilar las bibliotecas desde la fuente, necesita hacer finalmente:

sudo ldconfig


He intentado todas las soluciones. El -lopencv_core -lopencv_imgproc -lopencv_highgui en los comentarios resolvió mi problema. Y sé que mi línea de comando se ve así en geany:

g++ -lopencv_core -lopencv_imgproc -lopencv_highgui -o "%e" "%f"

Cuando construyo:

g++ -lopencv_core -lopencv_imgproc -lopencv_highgui -o "opencv" "opencv.cpp" (in directory: /home/fedora/Desktop/Implementations)

Los encabezados son:

#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp"


Si alguien sigue teniendo este problema. Una solución es reconstruir la biblioteca OpenCV de origen utilizando MinGW y no usar los archivos binarios dados por OpenCV. Lo hice y funcionó a la perfección.


Si hace lo siguiente, podrá usar la compilación opencv desde OpenCV_INSTALL_PATH.

cmake_minimum_required(VERSION 2.8) SET(OpenCV_INSTALL_PATH /home/user/opencv/opencv-2.4.13/release/) SET(OpenCV_INCLUDE_DIRS "${OpenCV_INSTALL_PATH}/include/opencv;${OpenCV_INSTALL_PATH}/include") SET(OpenCV_LIB_DIR "${OpenCV_INSTALL_PATH}/lib") LINK_DIRECTORIES(${OpenCV_LIB_DIR}) set(OpenCV_LIBS opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu) # find_package( OpenCV ) project(edge.cpp) add_executable(edge edge.cpp)


sigue este tutorial install-opencv.sh archivo install-opencv.sh en bash. esta en el tutorial

lee el ejemplo de openCV

CMakeLists.txt

cmake_minimum_required(VERSION 3.7) project(openCVTest) # cmake needs this line cmake_minimum_required(VERSION 2.8) # Define project name project(opencv_example_project) # Find OpenCV, you may need to set OpenCV_DIR variable # to the absolute path to the directory containing OpenCVConfig.cmake file # via the command line or GUI find_package(OpenCV REQUIRED) # If the package has been found, several variables will # be set, you can find the full list with descriptions # in the OpenCVConfig.cmake file. # Print some message showing some of them message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " libraries: ${OpenCV_LIBS}") message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") if(CMAKE_VERSION VERSION_LESS "2.8.11") # Add OpenCV headers location to your include paths include_directories(${OpenCV_INCLUDE_DIRS}) endif() # Declare the executable target built from your sources add_executable(main main.cpp) # Link your application with OpenCV libraries target_link_libraries(main ${OpenCV_LIBS})

main.cpp

/** * @file LinearBlend.cpp * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 ) * @author OpenCV team */ #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include <stdio.h> using namespace cv; /** Global Variables */ const int alpha_slider_max = 100; int alpha_slider; double alpha; double beta; /** Matrices to store images */ Mat src1; Mat src2; Mat dst; //![on_trackbar] /** * @function on_trackbar * @brief Callback for trackbar */ static void on_trackbar( int, void* ) { alpha = (double) alpha_slider/alpha_slider_max ; beta = ( 1.0 - alpha ); addWeighted( src1, alpha, src2, beta, 0.0, dst); imshow( "Linear Blend", dst ); } //![on_trackbar] /** * @function main * @brief Main function */ int main( void ) { //![load] /// Read images ( both have to be of the same size and type ) src1 = imread("../data/LinuxLogo.jpg"); src2 = imread("../data/WindowsLogo.jpg"); //![load] if( src1.empty() ) { printf("Error loading src1 /n"); return -1; } if( src2.empty() ) { printf("Error loading src2 /n"); return -1; } /// Initialize values alpha_slider = 0; //![window] namedWindow("Linear Blend", WINDOW_AUTOSIZE); // Create Window //![window] //![create_trackbar] char TrackbarName[50]; sprintf( TrackbarName, "Alpha x %d", alpha_slider_max ); createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar ); //![create_trackbar] /// Show some stuff on_trackbar( alpha_slider, 0 ); /// Wait until user press some key waitKey(0); return 0; }

Probado en linux mint 17