Нерешенная внешняя ошибка символа при импорте библиотек для OpenCV2.3 в Visual Studios 2010 Express C++
Первый раз отправив вопрос здесь в stackru. Извините, если я разделываю форматирование!
Я пытаюсь следовать базовому учебнику по openCV, а именно этому: http://aishack.in/tutorials/tracking-colored-objects-in-opencv/
Я посмотрел различные онлайн-учебники по установке openCV, в том числе:
Установите OpenCV-2.3 для Visual Studio 2010 и opencv.willowgarage.com/wiki/VisualC%2B%2B
без особой удачи.
Текущая версия, которую я сейчас использую, - OpenCV 2.3.0. В настоящее время я работаю на Windows 7 с Microsoft Visual C++ Express 2010.
Всякий раз, когда я пытаюсь собрать и запустить свой код, я получаю следующие ошибки:
1>------ Build started: Project: Camera, Configuration: Debug Win32 ------
1>camera.obj : error LNK2019: unresolved external symbol _cvReleaseImage referenced in function "struct _IplImage * __cdecl GetThresholdedImage(struct _IplImage *)" (?GetThresholdedImage@@YAPAU_IplImage@@PAU1@@Z)
1>camera.obj : error LNK2019: unresolved external symbol _cvInRangeS referenced in function "struct _IplImage * __cdecl GetThresholdedImage(struct _IplImage *)" (?GetThresholdedImage@@YAPAU_IplImage@@PAU1@@Z)
1>camera.obj : error LNK2019: unresolved external symbol _cvCvtColor referenced in function "struct _IplImage * __cdecl GetThresholdedImage(struct _IplImage *)" (?GetThresholdedImage@@YAPAU_IplImage@@PAU1@@Z)
1>camera.obj : error LNK2019: unresolved external symbol _cvCreateImage referenced in function "struct _IplImage * __cdecl GetThresholdedImage(struct _IplImage *)" (?GetThresholdedImage@@YAPAU_IplImage@@PAU1@@Z)
1>camera.obj : error LNK2019: unresolved external symbol _cvGetSize referenced in function "struct _IplImage * __cdecl GetThresholdedImage(struct _IplImage *)" (?GetThresholdedImage@@YAPAU_IplImage@@PAU1@@Z)
1>camera.obj : error LNK2019: unresolved external symbol _cvReleaseCapture referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvWaitKey referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvShowImage referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvAdd referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvLine referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvGetCentralMoment referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvGetSpatialMoment referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvMoments referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvQueryFrame referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvNamedWindow referenced in function _main
1>camera.obj : error LNK2019: unresolved external symbol _cvCreateCameraCapture referenced in function _main
1>C:\Users\Kevin\Documents\Visual Studio 2010\Projects\Camera\Debug\Camera.exe : fatal error LNK1120: 16 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Мой код выглядит следующим образом:
#include "cv.h"
#include "highgui.h"
IplImage* GetThresholdedImage(IplImage* img)
{
IplImage* imgHSV = cvCreateImage(cvGetSize(img), 8, 3);
cvCvtColor(img, imgHSV, CV_BGR2HSV);
IplImage* imgThreshed = cvCreateImage(cvGetSize(img), 8, 1);
cvInRangeS(imgHSV, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);
cvReleaseImage(&imgHSV);
return imgThreshed;
}
int main()
{
CvCapture* capture = 0;
capture = cvCaptureFromCAM(1);
if(!capture)
{
printf("Could not initialize capturing...\n");
getchar();
return -1;
}
cvNamedWindow("video");
cvNamedWindow("thresh");
IplImage* imgScribble = NULL;
while(1)
{
IplImage* frame = 0;
frame = cvQueryFrame(capture);
if(!frame)
break;
//cvErode(frame, frame, 0, 2); // ADD this line
//initalize the scribble frame if has not already been done yet
if(imgScribble == NULL)
{
imgScribble = cvCreateImage(cvGetSize(frame), 8, 3);
}
IplImage* imgYellowThresh = GetThresholdedImage(frame);
CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));
cvMoments(imgYellowThresh, moments, 1);
// The actual moment values
double moment10 = cvGetSpatialMoment(moments, 1, 0);
double moment01 = cvGetSpatialMoment(moments, 0, 1);
double area = cvGetCentralMoment(moments, 0, 0);
// Holding the last and current ball positions
static int posX = 0;
static int posY = 0;
int lastX = posX;
int lastY = posY;
posX = moment10/area;
posY = moment01/area;
printf("position (%d,%d)\n", posX, posY);
// We want to draw a line only if its a valid position
if(lastX>0 && lastY>0 && posX>0 && posY>0)
{
// Draw a yellow line from the previous point to the current point
cvLine(imgScribble, cvPoint(posX, posY), cvPoint(lastX, lastY), cvScalar(0,255,255), 5);
}
cvAdd(frame, imgScribble, frame);
cvShowImage("thresh", imgYellowThresh);
cvShowImage("video", frame);
int c = cvWaitKey(5);
if((char)c==27 )
break;
// Release the thresholded image+moments... we need no memory leaks.. please
cvReleaseImage(&imgYellowThresh);
delete moments;
}
// We're done using the camera. Other applications can now use it
cvReleaseCapture(&capture);
cvReleaseCapture(&capture);
return 0;
}
Я установил Open CV дляC:\OpenCV2.3
Я добавил дополнительные зависимости, дополнительные каталоги и т. Д. Для предпочтений моего проекта они следующие:
Дополнительные зависимости:
enter code here
opencv_core230.lib
opencv_highgui230.lib
opencv_legacy230.lib
opencv_video230.lib
opencv_ml230.lib
opencv_core230d.lib
opencv_highgui230d.lib
opencv_legacy230d.lib
opencv_video230d.lib
opencv_ml230d.lib
opencv_calib3d230d.lib
Каталоги дополнительных библиотек:C:\OpenCV2.3\build\x64\vc10\lib;C:\OpenCV2.3\build\x64\vc10\bin;C:\OpenCV2.3\build\x64\vc10\staticlib;%(AdditionalLibraryDirectories)
Дополнительные каталоги включения:
C:\OpenCV2.3\build\include\opencv;C:\OpenCV2.3\build\include\opencv2;C:\OpenCV2.3\build\include
Я также включил путь к DLL в моей переменной path для windows:
;C:\OpenCV2.3\build\x64\vc10\bin;C:\OpenCV2.3\build\bin;
Я смотрел на другие форумы, другие вопросы переполнения стека, и т.д. без особой помощи. Я пытался заставить это работать на лучшую часть выходных. Любая помощь приветствуется!
6 ответов
Если вы явно настроили связь со всеми необходимыми библиотеками, но ошибки связывания все еще отображаются, возможно, вы смешиваете 64/32-битные библиотеки и приложение.
Т.е. убедитесь, что во всех библиотеках указана 32-битная версия библиотеки, если вы создаете 32-битное приложение.
У меня была похожая проблема, когда я пытался скомпилировать библиотеку cvblob (http://code.google.com/p/cvblob/) в Windows 7 32bit с Visual Studio 2010.
Если все остальное сделано правильно, попробуйте мое предположение, написанное ниже.Если не начать с этих уроков:
- Установка OpenCV: http://docs.opencv.org/trunk/doc/tutorials/introduction/windows_install/windows_install.html
Конфигурирование ваших проектов для сборки и работы с opencv: http://docs.opencv.org/trunk/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html.
Эти ошибки компоновщика silimar исчезли после изменения некоторых свойств проекта:
- В VS 2010 откройте Ваше решение
- Открыть обозреватель решений (View->Solution Explorer)
- Найдите проект, который сгенерировал эти ошибки компоновщика. (В моем примере это был проект с именем "cvblob" внутри решения с именем "cvBlob", созданный cmake.)
- щелкните правой кнопкой мыши на этом проекте
- Из контекстного меню выберите свойства
- Слева выберите Свойства конфигурации -> Общие и найдите поле под названием "Расширение цели"
- В Project Details найдите настройки вашего проекта для "Тип конфигурации"
- проанализировать их. В моей конкретной проблеме компиляции cvblob мне пришлось установить расширение Target на.lib и тип конфигурации на статическую библиотеку. Это также решение для парней, пытающихся скомпилировать библиотеку cvblob в Visual Studio 2010. Сделайте то же самое для версий отладки и выпуска, если это необходимо.
Ошибки, которые я получил, были:
Ошибка 24, ошибка LNK2019: неразрешенный внешний символ _cvSetImageROI, указанный в функции _cvSetImageROItoBlob C:\cvblob\build\lib\cvblob.obj cvblob
Ошибка 25 ошибка LNK2019: неразрешенный внешний символ _cvSaveImage, указанный в функции _cvSaveImageBlob C:\cvblob\build\lib\cvblob.obj cvblob
Ошибка 26 ошибка LNK2019: неразрешенный внешний символ _cvGetImageROI, указанный в функции _cvSaveImageBlob C:\cvblob\build\lib\cvblob.obj cvblob
Ошибка 27, ошибка LNK2001: неразрешенный внешний символ _cvError C:\cvblob\build\lib\cvcolor.obj cvblob
Ошибка 28, ошибка LNK2019: неразрешенный внешний символ _cvError, указанный в функции _cvRenderBlob C:\cvblob\build\lib\cvblob.obj cvblob
Ошибка 29 ошибка LNK2001: неразрешенный внешний символ _cvError C:\cvblob\build\lib\cvlabel.obj cvblob
Ошибка 30, ошибка LNK2001: неразрешенный внешний символ _cvError C:\cvblob\build\lib\cvcontour.obj cvblob
Ошибка 31 ошибка LNK2001: неразрешенный внешний символ _cvError C:\cvblob\build\lib\cvtrack.obj cvblob
Ошибка 32 ошибка LNK2019: неразрешенный внешний символ _cvLine, указанный в функции _cvRenderBlob C:\cvblob\build\lib\cvblob.obj cvblob
Ошибка 33 ошибка LNK2001: неразрешенный внешний символ _cvLine C:\cvblob\build\lib\cvcontour.obj cvblob
Ошибка 34 Ошибка LNK2019: неразрешенный внешний символ _cvRectangle, указанный в функции _cvRenderBlob C:\cvblob\build\lib\cvblob.obj cvblob
Ошибка 35 Ошибка LNK2001: неразрешенный внешний символ _cvRectangle C:\cvblob\build\lib\cvtrack.obj cvblob
Ошибка 36 ошибка LNK2019: неразрешенный внешний символ _cvSetZero, указанный в функции _cvLabel C:\cvblob\build\lib\cvlabel.obj cvblob
Ошибка 37 ошибка LNK2019: неразрешенный внешний символ _cvPutText, указанный в функции _cvRenderTracks C:\cvblob\build\lib\cvtrack.obj cvblob
Ошибка 38 ошибка LNK2019: неразрешенный внешний символ _cvInitFont, указанный в функции _cvRenderTracks C:\cvblob\build\lib\cvtrack.obj cvblob
Ошибка 39 ошибка LNK1120: 9 неразрешенных внешних файлов C:\cvblob\build\lib\libs\Release\cvblob.dll cvblob
Надеюсь, это поможет кому-то собрать библиотеку cvblob в visual studio 2010.
У меня была похожая проблема в VS10, и я забыл добавить cv210d.lib
, Добавление этого к свойствам проекта-> свойств конфигурации-> Linker->Input->Adtional Dependencies помогло мне в решении этой проблемы. Я нашел из вопроса, что opencv_cv230.lib
не был включен в добавление дополнительных зависимостей, что поможет решить проблему.
Это может помочь с более новой версией.
Для версии 2.4.8 добавление opencv_imgproc248.lib устраняет следующую ошибку компоновки:
error LNK2019: unresolved external symbol _cvRemap referenced in function _main
error LNK2019: unresolved external symbol _cvInitUndistortMap referenced in function _main
error LNK2019: unresolved external symbol _cvFindCornerSubPix referenced in function _main
error LNK2019: unresolved external symbol _cvCvtColor referenced in function _main
У меня была такая же проблема, в vs10
я пропустил "opencv_core246d.lib", чтобы добавить. добавив его в Linker->Input->Adtional Dependencies исправлена ошибка.
Для меня эта ошибка была решена путем явного добавления двух имен lib под input (свойства конфигурации ->linker->input-> дополнительные зависимости).
когда вы устанавливаете opencv, в зависимости от версии к нему добавляется номер. Например, у меня opencv2.4.13, и он добавлен во все свои библиотеки 2413, opencv_highgui2413.lib (opencv_highgui2413d.lib для отладочной сборки).
Теперь проверьте, какие библиотеки имеют функции, которые были показаны в ошибках. highgui имеет функцию cvshowimage -> вы можете получить это, запустив его онлайн. http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html
Затем добавьте эту библиотеку для ввода и создайте свое решение.