win para opencvlibrary net libreria instalar files descargas descargar como c++ macos opencv osx-mavericks homebrew

c++ - opencvlibrary - Símbolos no definidos de OpenCV para la arquitectura x86_64: error



opencv windows c++ (2)

antes de que esto se marque como una pregunta repetida, lea el final. Gracias por mirar.

Configuré openCV usando home-brew.

Estos fueron los comandos que utilicé:

brew tap homebrew/science brew install opencv

Estoy usando el siguiente archivo simple que encontré en línea para probar mi configuración:

// Example showing how to read and write images #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main(int argc, char** argv) { // Load an image from file - change this based on your image name Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED); if(img.empty()) { fprintf(stderr, "failed to load input image/n"); return -1; } // this is just to show, that you won''t have to pre-alloc // result-images with c++ any more.. Mat gray; cvtColor(img,gray,CV_BGR2GRAY); // Write the image to a file with a different name, // using a different image format -- .png instead of .jpg if( ! imwrite("my_image_copy.png", img) ) { fprintf(stderr, "failed to write image file/n"); } // no need to release anything with c++ ! return 0; }

Este es el error que estoy obteniendo después de intentar compilar y ejecutar la g++ test.cpp -o test .

Undefined symbols for architecture x86_64: "cv::_InputArray::_InputArray(cv::Mat const&)", referenced from: _main in test-41a30e.o "cv::namedWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from: _main in test-41a30e.o "cv::destroyWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from: _main in test-41a30e.o "cv::Mat::deallocate()", referenced from: cv::Mat::release() in test-41a30e.o "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from: _main in test-41a30e.o "cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cv::_InputArray const&)", referenced from: _main in test-41a30e.o "cv::waitKey(int)", referenced from: _main in test-41a30e.o "cv::fastFree(void*)", referenced from: cv::Mat::~Mat() in test-41a30e.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Sí encontré problemas similares en el desbordamiento de la pila, pero ninguno usa homebrew y no estoy seguro de cuán urgente es el problema (con respecto a las actualizaciones y los cambios en OpenCV, mi sistema operativo, etc.). Estoy usando un Mac con el sistema operativo 10.9.4. Además, esas respuestas no eran realmente claras para mí, lo que debería cambiarse. Muchos simplemente sugirieron una línea de código sin decir a dónde debería ir la línea. Soy extremadamente novato con estas tecnologías. ¡Cualquier ayuda sería genial, gracias!

Editar: Mark Setchell ayudó con el primer lote de errores. Pero ahora estoy obteniendo: g ++ $ (pkg-config --cflags --libs opencv) test.cpp -o Test & ./Test

[3] 7187 dyld: Biblioteca no cargada: lib / libopencv_calib3d.2.4.dylib Remitida desde: /usr/local/Cellar/opencv/2.4.9/include/./ Motivo de la prueba: imagen no encontrada [2] Listo g ++ $ ( pkg-config --cflags --libs opencv) test.cpp -o Trazo de prueba / trampa BPT: 5

brewdoctor me dio esta advertencia: Advertencia: tiene barriles desvinculados en su bodega. Dejar los barriles desvinculados puede provocar problemas de construcción y hacer que las infusiones que dependen de esos barriles no se ejecuten correctamente una vez construidas. Ejecute el brew link en estos:

opencv

Así que ejecuté brew link --overwrite opencv pero obtuve esto:

Linking /usr/local/Cellar/opencv/2.4.9... Error: Could not symlink include/opencv/cv.h

necesitaba la sobrescritura porque brew link dio opencv

Linking /usr/local/Cellar/opencv/2.4.9... Error: Could not symlink include/opencv/cv.h Target /usr/local/include/opencv/cv.h already exists. You may want to remove it: rm /usr/local/include/opencv/cv.h


Usted está recibiendo errores de enlazador. Creo que es porque no estás enlazando con las bibliotecas correctas que requiere opencv .

La forma más fácil de obtener las bibliotecas correctas es con pkg-config , por lo que recomendaría:

brew install pkg-config

Entonces puede que tenga que volver a instalar opencv

brew reinstall opencv

o tal vez

brew uninstall opencv brew install opencv

Entonces deberías poder hacer:

g++ $(pkg-config --cflags --libs opencv) test.cpp -o Test

Tu puedes correr

pkg-config --cflags --libs opencv

para ver qué produce para el compilador de g++ si está interesado, le dice al compilador dónde se encuentran las bibliotecas y los archivos de encabezado. En mi sistema, produce esto:

pkg-config --cflags --libs opencv -I/usr/local/Cellar/opencv/2.4.12_2/include/opencv / -I/usr/local/Cellar/opencv/2.4.12_2/include / -L/usr/local/Cellar/opencv/2.4.12_2/lib / -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab

Si no está familiarizado con pkgconfig , puede solicitarle que le cuente todos los paquetes que conoce de esta manera:

pkg-config --list-all

Mi sistema da un resultado como este:

libzmq libzmq - 0MQ c++ library gio-unix-2.0 GIO unix specific APIs - unix specific headers for glib I/O library glibmm-2.4 glibmm - C++ wrapper for GLib libpostproc libpostproc - FFmpeg postprocessing library libgsf-1 libgsf-1 - A library for reading and writing structured files (eg MS OLE and Zip) gobject-introspection-no-export-1.0 gobject-introspection - GObject Introspection libtasn1 libtasn1 - Library for ASN.1 and DER manipulation libusb-1.0 libusb-1.0 - C API for USB device access from Linux, Mac OS X, Windows and OpenBSD/NetBSD userspace gio-2.0 GIO - glib I/O library libusb libusb - USB access library (libusb-1.0 compat wrapper) libecpg_compat libecpg_compat - PostgreSQL libecpg_compat library QtNetwork Qtnetwork - Qtnetwork Library opencv OpenCV - Open Source Computer Vision Library

Básicamente, la primera palabra en cada línea de la lista anterior le dice los nombres de los paquetes que pkgconfig conoce y ese es el nombre que debe especificar al ejecutar comandos tales como

pkg-config --cflags --libs opencv

Si su sistema está un poco desordenado, puede encontrar el archivo .pc que pkgconfig usa así:

find /usr/local/Cellar -name /*.pc

o

find /usr/local/Cellar -name /*.pc | grep -i opencv /usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc

Y luego usa el archivo de configuración directamente, así:

pkg-config --cflags --libs /usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc

Si todo se compila correctamente, puede ejecutarlo con

./Test


Obtiene estos errores porque está utilizando métodos de OpenCV en su código que no están vinculados a su proyecto.

Hasta ahora solo has incluido:

#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>

Pero para ejecutar su código necesita mucho más que estas dos bibliotecas OpenCV . Por ejemplo, tomemos el siguiente error cuando intentemos construir su proyecto en XCODE:

Undefined symbols for architecture x86_64: "cv::imread(cv::String const&, int)", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

que corresponde a esta parte de tu error:

... "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from: _main in test-41a30e.o ...

Esto ocurre porque XCODE está buscando ejecutar la siguiente función en su código:

Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);

pero de la forma en que lo ha implementado, no sabe qué es imread () , ¡porque falta la referencia a la biblioteca de opencv ! la Biblioteca que resuelve este problema en particular es:

libopencv_imgcodecs.3.1.0.dylib

(Por supuesto, la versión depende de la versión de OpenCV que esté usando).

Para resolver este error en particular, debe hacer 2 pasos:

  1. Agregue la biblioteca a su proyecto: haga clic derecho en su archivo de proyecto. Haga clic en "Agregar archivos a blabla" y luego busque su directorio de OpenCV. Las bibliotecas deben ubicarse en

/Users/YOURNAME/YOURFOLDER/opencv-3.1.0/build/lib

¡Precaución! ¡Esto podría depender de cómo hayas instalado OpenCV! Si lo ha instalado usando Homebrew. El directorio debería estar aquí:

/usr/local/Cellar/opencv/2.4.9/lib

Seleccione la siguiente biblioteca (libopencv_imgcodecs.3.1.0.dylib) y agréguela a su proyecto:

Después de haber agregado la Biblioteca a su Proyecto, debe aparecer en la lista a la izquierda. Verifica que hayas elegido la biblioteca correcta. ¡Algunos de ellos tienen nombres bastante similares!

  1. Incluye la biblioteca en tu archivo C ++

Como lo has hecho con:

#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>

Ahora debería continuar e incluir también la nueva Biblioteca:

#include "opencv2/imgcodecs/imgcodecs.hpp"

  1. Ejecute su programa

Cuando construyas tu programa nuevamente, deberías tener un error menos. Y XCODE no debería tener un problema para ejecutar cv :: imread .

Como tiene muchos errores, debe continuar verificando qué bibliotecas necesita para construir su programa con éxito.

Recomendaría vincular estas bibliotecas ya que son muy comunes:

#include <iostream> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/core/core.hpp" #include "opencv2/video/video.hpp" #include "opencv2/imgcodecs/imgcodecs.hpp"

Antes de volverse loco por todos los errores, podría vincular todas las bibliotecas y ver si se compila correctamente.