OpenCV, ошибка ссылки в коде XCode, неопределенные символы для архитектуры x86_64: & quot; _cvHaarDetectObjects & quot ;, ссылка на: _main в main.o

Я пытаюсь использовать openCV (v 2.4.6) для macOSX (v 10.7.4) с Xcode (v 4.6.2).

Я правильно установил библиотеку (я думаю, у меня нет ошибок, так что …) с помощью cmake, после установки я запускаю тестовый проект для успешной визуализации изображения (следующее этот урок для установки и тестирования проекта):

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

using namespace std;
using namespace cv;

int main (int argc, const char * argv[])
{
Mat img = imread("/Users/username/path/image.jpg");
if (img.data == 0) {
cerr << "Image not found!" << endl;
return -1;
}
namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image", img);
waitKey();
}

После этого я использовал код из примера, найденного в библиотеке openCV, чтобы сделать кое-что более интересное с моим тестовым проектом (это должен быть фрейтрекер)

#include <opencv2/opencv.hpp>
#include <CoreFoundation/CoreFoundation.h>
#include <cassert>
#include <iostream>

const char  * WINDOW_NAME  = "Face Tracker";
const CFIndex CASCADE_NAME_LEN = 2048;

char  CASCADE_NAME[CASCADE_NAME_LEN] = "/Users/username/path/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml";

using namespace std;

int main (int argc, char * const argv[])
{
const int scale = 2;

// locate haar cascade from inside application bundle
// (this is the mac way to package application resources)
CFBundleRef mainBundle  = CFBundleGetMainBundle ();
assert(mainBundle);

CFURLRef cascade_url = CFBundleCopyResourceURL (mainBundle, CFSTR("haarcascade_frontalface_alt2"), CFSTR("xml"), NULL);
assert(cascade_url);

Boolean got_it = CFURLGetFileSystemRepresentation (cascade_url, true, reinterpret_cast<UInt8 *>(CASCADE_NAME),CASCADE_NAME_LEN);
if (! got_it)
abort ();

// create all necessary instances
cvNamedWindow (WINDOW_NAME, CV_WINDOW_AUTOSIZE);
CvCapture * camera = cvCreateCameraCapture (CV_CAP_ANY);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad (CASCADE_NAME, 0, 0, 0);
CvMemStorage* storage = cvCreateMemStorage(0);
assert (storage);

// you do own an iSight, don't you ?!?
if (! camera)
abort ();

// did we load the cascade?!?
if (! cascade)
abort ();

// get an initial frame and duplicate it for later work
IplImage *  current_frame = cvQueryFrame (camera);
IplImage *  draw_image    = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 3);
IplImage *  gray_image    = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 1);
IplImage *  small_image   = cvCreateImage(cvSize (current_frame->width / scale, current_frame->height / scale), IPL_DEPTH_8U, 1);
assert (current_frame && gray_image && draw_image);

// as long as there are images ...
while ((current_frame = cvQueryFrame (camera)))
{
// convert to gray and downsize
cvCvtColor (current_frame, gray_image, CV_BGR2GRAY);
cvResize (gray_image, small_image, CV_INTER_LINEAR);

// detect faces
CvSeq* faces = cvHaarDetectObjects (small_image, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize (30, 30));

// draw faces
cvFlip (current_frame, draw_image, 1);
for (int i = 0; i < (faces ? faces->total : 0); i++)
{
CvRect* r = (CvRect*) cvGetSeqElem (faces, i);
CvPoint center;
int radius;
center.x = cvRound((small_image->width - r->width*0.5 - r->x) *scale);
center.y = cvRound((r->y + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
cvCircle (draw_image, center, radius, CV_RGB(0,255,0), 3, 8, 0 );
}

// just show the image
cvShowImage (WINDOW_NAME, draw_image);

// wait a tenth of a second for keypress and window drawing
int key = cvWaitKey (100);
if (key == 'q' || key == 'Q')
break;
}

// be nice and return no error
return 0;
}

На этот раз что-то не так, это ошибка:

Ld /Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug/OpenCVDemo normal x86_64
cd /Users/winimac01/Desktop/IOSapp/sviluppo/OpenCVDemo
setenv MACOSX_DEPLOYMENT_TARGET 10.7
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -L/Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug -F/Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug -filelist /Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Intermediates/OpenCVDemo.build/Debug/OpenCVDemo.build/Objects-normal/x86_64/OpenCVDemo.LinkFileList -mmacosx-version-min=10.7 -lopencv_core -lopencv_highgui -lopencv_imgproc -stdlib=libstdc++ -framework CoreFoundation -lopencv_core.2.4.6 -lopencv_highgui.2.4.6 -o /Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug/OpenCVDemo

Undefined symbols for architecture x86_64:
"_cvHaarDetectObjects", 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)

Есть идеи?

edit1:

Некоторая информация из настроек сборки:

Architectures: 64-bit Intel
Base SDK Latest: OSx (OSX 10.8)
Valid Architectures: i386 x86_64
Other Linker Flags: none
C Language Dialect: GNU99 [-std=gnu99]
C++ Language Dialect: GNU++11 [-std=gnu++11]
C++ Standard Library: libc++ (LLVM C++ standard library with C++)

редактировать 2:

что-то интересное, компиляция терминалом с

g++ `pkg-config --cflags --libs opencv` main.cpp

Я получаю эти ошибки:

Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
Undefined symbols for architecture x86_64:
"_CFBundleCopyResourceURL", referenced from:
_main in cc6OpS79.o
"_CFBundleGetMainBundle", referenced from:
_main in cc6OpS79.o
"_CFURLGetFileSystemRepresentation", referenced from:
_main in cc6OpS79.o
"___CFConstantStringClassReference", referenced from:
CFString in cc6OpS79.o
CFString in cc6OpS79.o
"_cvCircle", referenced from:
_main in cc6OpS79.o
"_cvCreateCameraCapture", referenced from:
_main in cc6OpS79.o
"_cvCreateImage", referenced from:
_main in cc6OpS79.o
"_cvCreateMemStorage", referenced from:
_main in cc6OpS79.o
"_cvCvtColor", referenced from:
_main in cc6OpS79.o
"_cvFlip", referenced from:
_main in cc6OpS79.o
"_cvGetSeqElem", referenced from:
_main in cc6OpS79.o
"_cvHaarDetectObjects", referenced from:
_main in cc6OpS79.o
"_cvLoad", referenced from:
_main in cc6OpS79.o
"_cvNamedWindow", referenced from:
_main in cc6OpS79.o
"_cvQueryFrame", referenced from:
_main in cc6OpS79.o
"_cvResize", referenced from:
_main in cc6OpS79.o
"_cvShowImage", referenced from:
_main in cc6OpS79.o
"_cvWaitKey", referenced from:
_main in cc6OpS79.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

1

Решение

Я считаю, что это связано с тем, что библиотека objdetect не связана. В упомянутом учебнике вы должны указать его в шаге vi.) Вместе с двумя другими библиотеками.

libopencv_core.2.3.1.dylib
libopencv_highgui.2.3.1.dylib
libopencv_objdetect.2.3.1.dylib
1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector