OpenCv 2.4.3: не удается найти imread и SurfFeatureDetector :: обнаружить

на Mac OSX 10.8, XCode 4.6, в C ++

Я следую за учебником в opencv_tutorials.pdf, находится в /opt/local/share/OpenCV/doc в моей системе. На странице 311 мы получаем этот пример (слегка отредактированный):

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/highgui/highgui.hpp"using namespace cv;
int main( int argc, char** argv ) {
Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
int minHessian = 400;
SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> keypoints_1;
detector.detect( img_1, keypoints_1 );
}

Мне пришлось изменить код выше, чтобы #include "opencv2/nonFree/features2d.hpp", файл, который я нашел, запустив

find /opt/local/include -name "*.hpp" -exec grep SurfFeatureDetector "{}" ';' -print

Код компилируется, что означает, что символ detector.detect находится в hpp файл и проходит проверку типа компилятором C ++. Далее стоит попытаться найти библиотеки, которые содержат символы.

Теперь у меня есть эти библиотеки в моем дистрибутиве, в /opt/local/lib:

libopencv_calib3d.2.4.3.dylib
libopencv_contrib.2.4.3.dylib
libopencv_core.2.4.3.dylib
libopencv_features2d.2.4.3.dylib
libopencv_flann.2.4.3.dylib
libopencv_gpu.2.4.3.dylib
libopencv_highgui.2.4.3.dylib
libopencv_imgproc.2.4.3.dylib
libopencv_legacy.2.4.3.dylib
libopencv_ml.2.4.3.dylib
libopencv_nonfree.2.4.3.dylib
libopencv_objdetect.2.4.3.dylib
libopencv_photo.2.4.3.dylib
libopencv_stitching.2.4.3.dylib
libopencv_ts.2.4.3.dylib
libopencv_video.2.4.3.dylib
libopencv_videostab.2.4.3.dylib

Я нашел это неинформативным для nm ищите в них нужные символы, потому что искажение имени трудно декомпилировать в моей голове. Я просто перебор включил все библиотеки, но все еще получаю ошибки компоновщика:

Undefined symbols for architecture x86_64:
"cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
_main in main.o
"cv::FeatureDetector::detect(cv::Mat const&, std::__1::vector<cv::KeyPoint, std::__1::allocator<cv::KeyPoint> >&, cv::Mat const&) const", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64

Я провел некоторую выборочную проверку справочных документов OpenCv и вики-страниц, начиная с этой страницы.

http://opencv.willowgarage.com/documentation/cpp/features2d__feature_detection_and_descriptor_extraction.html

но без успеха.

Я был бы благодарен за

  1. конкретная помощь в поиске этих API OpenCv
  2. общие стратегии для этого вида запроса: «какая библиотека содержит символ, с которым мне нужно связать». Такая проблема заставляет меня ненавидеть C ++, так как 5-минутное кодирование всегда, кажется, приводит к часам поисков в библиотеке, что может быть связано с тем, что я просто не знаю профессионального секрета для этого.

1

Решение

Мой набор инструментов использует CMake для отслеживания подобных вещей. Для большинства новых библиотек, которые я использую, обычно есть Google Search * сопровождающие файлы Find * .cmake, которые написаны другими. Если вам нужна дополнительная информация о моей конкретной настройке, не стесняйтесь спрашивать. Я видел эту конкретную проблему (неопределенные символы для архитектуры x86_64) несколько раз для вещей в несвободных библиотеках. Я не уверен, почему вы получаете эту ошибку за непрочитанное, хотя. Первое место, которое я бы посмотрел, это пример matcher_simple.cpp в папке samples / cpp. Если вы можете скомпилировать и запустить это (используя этот) и другие примеры, ваша установка должна быть в порядке. Если вы не можете, не могли бы вы опубликовать ошибки этого примера? Я не знаком с XCode, но кто-нибудь другой предложил перейти в Настройки сборки> Параметры сборки> Компилятор для C / C ++ / Objective-C и изменить его с Apple LLVM Compiler на LLVM GCC 4.2. И есть еще несколько догадок Вот тоже.

2

Другие решения

На Linux и использование OpenCV 3.0.0 Я должен был связаться с opencv_imgcodecs общая библиотека

8

Попробуйте в том числе -lopencv_features2d а также -lopencv_nonfree в вашем списке других флагов компоновщика в настройках сборки. У меня были те же проблемы, и у меня это сработало

0
По вопросам рекламы [email protected]