8

第一次在这里向stackoverflow发布问题。对不起,如果我破坏了格式!

我正在尝试遵循关于 openCV 的基本教程,即这个: http ://aishack.in/tutorials/tracking-colored-objects-in-opencv/

我在网上查看了有关如何安装 openCV 的各种教程,包括:

为 Visual Studio 2010和 opencv.willowgarage.com/wiki/VisualC%2B%2B设置 OpenCV-2.3

没有太多的运气。

我现在运行的当前版本是 OpenCV 2.3.0。我目前正在使用 Microsoft Visual C++ Express 2010 在 Windows 7 上运行。

每当我尝试构建和运行代码时,都会收到以下错误:

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

我还在 Windows 的路径变量中包含了 DLL 的路径:

;C:\OpenCV2.3\build\x64\vc10\bin;C:\OpenCV2.3\build\bin;

我查看了其他论坛、其他堆栈溢出问题等,但没有太多帮助。我一直在努力让它在周末的大部分时间里工作。任何帮助将非常感激!

4

6 回答 6

21

如果您明确设置了与所有必要库的链接,但仍然显示链接错误,则您可能混淆了 64/32 位库和应用程序。

即,如果您正在构建 32 位应用程序,请确保所有库都包含指向 32 位版本的库。

于 2013-01-15T15:32:38.580 回答
3

我在尝试使用 Visual Studio 2010 在 Windows 7 32 位上编译 cvblob 库 (http://code.google.com/p/cvblob/) 时遇到了类似的问题。

如果其他一切都正确完成,请尝试下面写的我的猜测。 如果不是从这些教程开始:

  • 安装 OpenCV:http ://docs.opencv.org/trunk/doc/tutorials/introduction/windows_install/windows_install.html#cpptutwindowsmakeown
  • 配置您的项目以构建和使用 opencv:http ://docs.opencv.org/trunk/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html#windows-visual-studio-how-to 。

    更改某些项目属性后,这些类似的链接器错误消失了:

    • 在 VS 2010 中打开你的解决方案
    • 打开解决方案资源管理器(查看->解决方案资源管理器)
    • 查找生成这些链接器错误的项目。(在我的示例中,它是由 cmake 生成的名为“cvBlob”的解决方案内部名为“cvblob”的项目。)
    • 右键单击该项目
    • 从上下文菜单中选择属性
    • 在左侧选择Configuration properties -> General并找到一个名为“Target extension”的字段
    • 在项目详细信息中找到“配置类型”的项目设置
    • 分析它们。在我编译 cvblob 的特殊问题中,我必须将目标扩展设置为 .lib并将配置类型设置为静态库。这也是尝试在 Visual Studio 2010 中编译 cvblob 库的人的解决方案 。如果需要,对 Debug 和 Release 版本执行相同操作。

我得到的错误是:

错误 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 error LNK2001: unresolved external symbol _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 error LNK1120: 9 unresolved externals C:\cvblob\build\lib\libs\Release\cvblob.dll cvblob

我希望它能帮助有人在 Visual Studio 2010 中编译 cvblob 库。

于 2012-05-19T15:25:02.077 回答
2

我在 vs10 中遇到了类似的问题,我忘记添加cv210d.lib. 将其添加到项目属性->配置属性->链接器->输入->附加依赖项帮助我解决了这个问题。我opencv_cv230.lib从未包含在附加依赖项中的问题中发现,这将有助于解决问题。

于 2014-03-27T11:25:28.867 回答
1

我有同样的问题,在 vs10

我错过了要添加的“opencv_core246d.lib”。将其添加到 Linker->Input->Additional Dependencies 修复错误。

于 2013-07-30T01:28:17.197 回答
1

这可能有助于更新版本。
对于 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
于 2014-01-11T16:33:07.767 回答
0

对我来说,通过在输入下显式添加两个库名称(配置属性-->链接器-->输入-->附加依赖项)解决了这个错误。

当您安装 opencv 时,它会根据版本附加一个数字。例如,我有 opencv2.4.13,它的所有库 opencv_highgui2413.lib (用于调试构建的 opencv_highgui2413d.lib)都附加了 2413。

现在,检查哪些库具有错误中显示的功能。highgui 有 cvshowimage 功能 --> 你可以通过在线灼烧它来获得它。 http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html

然后将该库添加到输入并构建您的解决方案。

于 2017-07-03T09:59:23.047 回答