avant que cela ne soit signalé comme une question répétée, veuillez lire la fin. Merci d'avoir regardé.
J'ai mis en place openCV en utilisant du breuvage maison.
Ce sont les commandes que j'ai utilisées:
brew tap homebrew/science
brew install opencv
J'utilise le fichier simple suivant que j'ai trouvé en ligne pour tester ma configuration:
// 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;
}
Voici l'erreur que j'obtiens après avoir essayé de compiler et d'exécuter les poursuites 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)
J'ai trouvé des problèmes similaires sur le débordement de la pile, mais aucun n'utilise homebrew et je ne sais pas à quel point le problème est sensible au temps (en ce qui concerne les mises à jour et les modifications d'OpenCV, de mon système d'exploitation, etc.). J'utilise un mac avec le système d'exploitation 10.9.4. De plus, ces réponses n'étaient pas vraiment claires pour moi sur ce qui devait être changé. Beaucoup ont simplement suggéré une ligne de code sans dire où la ligne devrait aller. Je suis extrêmement novice avec ces technologies. Toute aide serait super merci!
Edit: Mark Setchell a aidé avec le premier lot d'erreurs. Mais je reçois maintenant: g ++ $ (pkg-config --cflags --libs opencv) test.cpp -o Test & ./Test
[3] 7187 dyld: Bibliothèque non chargée: lib/libopencv_calib3d.2.4.dylib Référencé depuis: /usr/local/Cellar/opencv/2.4.9/include/./Test Reason: image introuvable [2] Terminé g ++ $ ( pkg-config --cflags --libs opencv) test.cpp -o Test Trace/BPT trap: 5
brewdoctor m'a donné cet avertissement: Avertissement: vous avez dissocié les fûts dans votre cave Le fait de laisser les fûts non liés peut entraîner des problèmes de construction et entraîner le dysfonctionnement des infusions qui dépendent de ces fûts une fois construites. Courir brew link
sur ceux-ci:
opencv
J'ai donc exécuté le lien de brassage - écraser opencv mais j'ai obtenu ceci:
Linking /usr/local/Cellar/opencv/2.4.9...
Error: Could not symlink include/opencv/cv.h
besoin de l'écraser parce que le lien de brassage opencv a donné
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
Vous obtenez des erreurs de l'éditeur de liens. Je pense que c'est parce que vous ne liez pas avec les bibliothèques correctes que opencv
requiert.
Le moyen le plus simple d'obtenir les bibliothèques correctes est avec pkg-config
, donc je recommanderais:
brew install pkg-config
Ensuite, vous devrez peut-être réinstaller opencv
brew reinstall opencv
ou peut-être
brew uninstall opencv
brew install opencv
Ensuite, vous devriez pouvoir faire:
g++ $(pkg-config --cflags --libs opencv) test.cpp -o Test
Tu peux courir
pkg-config --cflags --libs opencv4
pour voir ce qu'il produit pour le g++
compilateur si vous êtes intéressé - il indique au compilateur où se trouvent les bibliothèques et les fichiers d'en-tête. Sur mon système, il génère ceci:
pkg-config --cflags --libs opencv4
-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 vous n'êtes pas familier avec pkgconfig
, vous pouvez lui demander de vous dire tous les paquets qu'il connaît comme ceci:
pkg-config --list-all
Mon système donne une sortie comme celle-ci:
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
opencv4 OpenCV - Open Source Computer Vision Library
Fondamentalement, le premier mot de chaque ligne de la liste ci-dessus vous indique les noms des packages que pkgconfig
connaît et c'est le nom que vous devez spécifier lors de l'exécution de commandes telles que
pkg-config --cflags --libs opencv4
Si votre système est un peu foiré, vous pouvez trouver le .pc
fichier que pkgconfig
utilise comme ceci:
find /usr/local/Cellar -name \*.pc
ou
find /usr/local/Cellar -name \*.pc | grep -i opencv
/usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc
Et puis utilisez directement le fichier de configuration, comme ceci:
pkg-config --cflags --libs /usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc
Si tout se compile correctement, vous pouvez l'exécuter avec
./test
Vous obtenez ces erreurs car vous utilisez des méthodes OpenCV dans votre code qui ne sont pas liées à votre projet.
Jusqu'à présent, vous n'avez inclus que:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
Mais pour exécuter votre code, vous avez besoin de bien plus que ces deux bibliothèques OpenCV. Par exemple, prenons l'erreur suivante lorsque vous essayez de créer votre projet dans 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)
ce qui correspond à cette partie de votre erreur:
... "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 ...
Cela se produit car XCODE cherche à exécuter la fonction suivante dans votre code:
Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);
mais la façon dont vous avez implémenté cela, il ne sait pas ce qu'est imread () , car la référence à opencv bibliothèque manquante! la bibliothèque qui résout ce problème particulier est:
libopencv_imgcodecs.3.1.0.dylib
(Bien sûr, la version dépend de la version de OpenCV que vous utilisez.)
Pour résoudre cette erreur particulière, vous devez effectuer 2 étapes:
/Users/YOURNAME/YOURFOLDER/opencv-3.1.0/build/lib
Mise en garde! Cela pourrait dépendre de la façon dont vous avez installé OpenCV! Si vous l'avez installé en utilisant Homebrew, le répertoire devrait être ici:
/usr/local/Cellar/opencv/2.4.9/lib
Sélectionnez la bibliothèque suivante (libopencv_imgcodecs.3.1.0.dylib) et ajoutez-la à votre projet:
Après avoir ajouté la bibliothèque à votre projet, elle devrait apparaître dans la liste de gauche. Vérifiez que vous avez choisi la bonne bibliothèque. Certains d'entre eux ont des noms assez similaires!
Comme vous l'avez fait avec:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
Vous devriez maintenant continuer et inclure également la nouvelle bibliothèque:
#include "opencv2/imgcodecs/imgcodecs.hpp"
Lorsque vous générez à nouveau votre programme, vous devriez avoir une erreur de moins. Et XCODE ne devrait pas avoir de problème pour exécuter cv :: imread .
Comme vous avez beaucoup d'erreurs, vous devriez maintenant continuer en vérifiant les bibliothèques dont vous avez besoin pour construire votre programme avec succès.
Je recommanderais de lier ces bibliothèques car elles sont très courantes:
#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"
Avant de devenir fou de toutes les erreurs, vous pouvez simplement lier toutes les bibliothèques et voir si elles se construisent correctement.
Mon problème était que le brew était compilé et lié avec Xcode, et j'utilisais une version différente de g ++ de macports. Je viens d'ajouter l'emplacement Xcode g ++ à mon $PATH
variable dans mon .bash_profile
fichier et dissociation du mauvais binaire g ++ avec Sudo port select --set gcc none
. Vous pouvez trouver l'emplacement Xcode g ++ en exécutant xcodebuild -find g++
, Le mien était /Applications/Xcode.app/Contents/Developer/usr/bin/g++
.