【问题标题】:OpenCV undefined reference to MatOpenCV 未定义对 Mat 的引用
【发布时间】:2014-06-18 08:02:16
【问题描述】:

我正在尝试在 C++ 中学习 openCV,并且正在使用 Windows 7(x64) 上最新版本的 openCV 处理代码块 13.12。一开始我测试了我的网络摄像头的一个简单输出,女巫工作没有问题。接下来,我尝试使用cvtColor(img, img_gray, CV_BGR2GRAY) 修改输出。正如您在下面看到的,我收到 2 条错误消息。另外澄清一下,VisuWork vW 是我为了在OOP 中正确编码作为练习而创建的一个类。班级没有做任何特别的事情。 请问谁能帮我找到这个问题的问题? 感谢您的帮助和时间。


main.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <opencv/highgui.h>

using namespace cv;
using namespace std;

    class VisuWork
    {
        CvCapture* capture;
    public:
        VisuWork()
        {
            capture=cvCaptureFromCAM(CV_CAP_ANY);
        };
        template<typename Type> void sHow(Type frame)
        {
    //        IplImage* frame = cvQueryFrame(capture); //Create image frames from capture
            cvShowImage("Camera_Output", frame); //Show image frames on created window
        }
    //    void imHSV(IplImage* frame){
    //        Mat im(frame);
    //        Mat hsv;
    //        cvtColor(im, hsv, CV_BGR2HSV);
    //    }
        ~VisuWork()
        {
            cvReleaseCapture(&capture); //Release capture.
            cvDestroyWindow("Camera_Output"); //Destroy Window
        }

    };

        int main( int argc, const char** argv )
        {
            CvCapture* capture = 0;
            capture = cvCaptureFromCAM(CV_CAP_ANY);
            if (!capture)
            {
                // print error, quit application
            }
            else
            {
                VisuWork vW;
                while(1)  //Create infinte loop for live streaming
                {
                    IplImage* im = cvQueryFrame(capture);
                    if(!im){}
                    else{
                    //        vW.imHSV(frame);

                    Mat img_gray(im);
                    vW.sHow(im);
                  cvtColor(img, img_gray, CV_BGR2GRAY);
                    }
                    int key = cvWaitKey(10); //Capture Keyboard stroke
                    if (char(key) == 27)
                    {
                        break; //If you hit ESC key loop will break.
                    }
                }
                cvReleaseCapture(&capture); //Release capture.
                cvDestroyWindow("Camera_Output"); //Destroy Window
            }

        }

错误信息:

C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x7b): undefined reference to cv::Mat::Mat(_IplImage const*, bool) C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]+0x2d): undefined reference to cv::fastFree(void*)


这是完整的构建日志:


mingw32-g++.exe -std=c++11 -Wall -IC:\RPS\python\edp32\opencv\build\include -c C:\Users\PTOSH\Documents\tried.cpp -o C: \Users\PTOSH\Documents\tried.o mingw32-g++.exe -LC:\RPS\python\edp32\opencv\build\x86\vc12\lib -L"C:\Program Files (x86)\CodeBlocks\MinGW\lib" -LC:\RPS\python\ edp32\opencv\sources\3rdparty -o C:\Users\PTOSH\Documents\tried.exe C:\Users\PTOSH\Documents\tried.o C:\RPS\python\edp32\opencv\build\x86\vc12\ lib\opencv_calib3d248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_calib3d248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_contrib248.lib C :\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_contrib248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_core248.lib C:\RPS\python\ edp32\opencv\build\x86\vc12\lib\opencv_core248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_features2d248.lib C:\RPS\python\edp32\opencv\build\ x86\vc12\lib\opencv_features2d248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_flann248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\ opencv_flann248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_gpu248.lib C:\RPS\python\edp32\open cv\build\x86\vc12\lib\opencv_gpu248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_highgui248.lib C:\RPS\python\edp32\opencv\build\x86\ vc12\lib\opencv_highgui248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_imgproc248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_imgproc248d。库 C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_legacy248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_legacy248d.lib C:\RPS\ python\edp32\opencv\build\x86\vc12\lib\opencv_ml248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_ml248d.lib C:\RPS\python\edp32\opencv\ build\x86\vc12\lib\opencv_nonfree248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_nonfree248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\ lib\opencv_objdetect248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_objdetect248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_ocl248.lib C :\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_ocl248d.lib C:\RPS\python\ed p32\opencv\build\x86\vc12\lib\opencv_photo248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_photo248d.lib C:\RPS\python\edp32\opencv\build\ x86\vc12\lib\opencv_stitching248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_stitching248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\ opencv_superres248.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_superres248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_ts248.lib C:\ RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_ts248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_video248.lib C:\RPS\python\edp32\ opencv\build\x86\vc12\lib\opencv_video248d.lib C:\RPS\python\edp32\opencv\build\x86\vc12\lib\opencv_videostab248.lib C:\RPS\python\edp32\opencv\build\x86\ vc12\lib\opencv_videostab248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_calib3d248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_calib3d248d。库 C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_contrib248.l ib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_contrib248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_core248.lib C:\RPS\ python\edp32\opencv\build\x64\vc12\lib\opencv_core248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_features2d248.lib C:\RPS\python\edp32\opencv\ build\x64\vc12\lib\opencv_features2d248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_flann248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\ lib\opencv_flann248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_gpu248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_gpu248d.lib C :\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_highgui248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_highgui248d.lib C:\RPS\python\ edp32\opencv\build\x64\vc12\lib\opencv_imgproc248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_imgproc248d.lib C:\RPS\python\edp32\opencv\build\ x64\vc12\lib\opencv_legacy248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\openc v_legacy248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_ml248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_ml248d.lib C:\ RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_nonfree248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_nonfree248d.lib C:\RPS\python\edp32\ opencv\build\x64\vc12\lib\opencv_objdetect248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_objdetect248d.lib C:\RPS\python\edp32\opencv\build\x64\ vc12\lib\opencv_ocl248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_ocl248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_photo248。库 C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_photo248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_stitching248.lib C:\RPS\ python\edp32\opencv\build\x64\vc12\lib\opencv_stitching248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_superres248.lib C:\RPS\python\edp32\opencv\构建\x64\vc12\lib\opencv_superres248d.lib C:\RPS\python\edp32\opencv\build\x64 \vc12\lib\opencv_ts248.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_ts248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_video248 .lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_video248d.lib C:\RPS\python\edp32\opencv\build\x64\vc12\lib\opencv_videostab248.lib C:\RPS \python\edp32\opencv\build\x64\vc12\lib\opencv_videostab248d.lib C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x7b): 未定义引用cv::Mat::Mat(_IplImage const*, bool)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]+0x2d): undefined reference tocv::fastFree(void)'* c:/程序文件 (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C: \Users\PTOSH\Documents\tried.o:`.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]' 部分中的错误重定位地址 0x2d c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:最终链接失败:无效操作 collect2.exe:错误:ld 返回 1 退出状态 进程以状态 1 终止(0 分钟,1 秒) 2 个错误,0 个警告(0 分钟,1 秒)

【问题讨论】:

  • “我正在尝试用 C++ 学习 openCV” - 但你使用的是 c-api(这是个坏主意)
  • 在一个类中混合C API是个好主意吗?

标签: c++ c windows opencv


【解决方案1】:

如果你真的想使用 c++ api(你应该使用,因为旧的 c-one 已),

CvCapture* capture; 
// no, use: cv::VideoCapture

IplImage* frame = cvQueryFrame(capture); 
// no, use: cv::Mat frame; capture.read(frame)

等等。丢弃所有 cv* 函数并用它们的 cv:: 对应函数替换它们 (也许从头开始更好)

(顺便说一句,来自 SO 的代码 sn-ps 几乎总是过时的,请注意这一点)

并阅读docs(底部的教程链接)


整个摄像头捕获在 C++ 中归结为几行代码:

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main()
{
    VideoCapture cap(0); // get first cam
    while( cap.isOpened() )
    {
        Mat frame;
        if ( ! cap.read(frame) ) // cam might need some warmup
            continue;

        // your processing goes here

        imshow("lalala",frame);
        if ( waitKey(10)==27 )
            break;
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    @berak:好的,我删除了#include &lt;opencv/highgui.h&gt;。但仍然面临 cvtColor() 部分的问题。

    C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x75): 未定义引用cv::Mat::Mat(_IplImage const*, bool)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x9b): undefined reference tocv::_OutputArray::_OutputArray(cv::Mat&)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0xae): 未定义引用cv::_InputArray::_InputArray(cv::Mat const&)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0xd3): undefined reference tocv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int )'

    @a-Jays:为什么不呢?无论如何,我删除了这个类,也许通过先开始测试 openCV 更容易。

    感谢您的回复。

    【讨论】:

    • "首先开始测试 openCV 可能会更容易。" -是的,好主意!
    【解决方案3】:

    @berak:

    如果你真的想使用 c++ api(你应该,因为旧 c-one 死了),

    > CvCapture* capture;  // no, use: cv::VideoCapture
    > 
    > IplImage* frame = cvQueryFrame(capture);  // no, use: cv::Mat frame;
    > capture.read(frame)
    

    等等。丢弃所有 cv* 函数并用它们的 cv:: 替换它们 同行(也许从头开始更好)

    (顺便说一句,来自 SO 的代码 sn-ps 几乎总是过时的,请注意 那个)

    并阅读文档(底部的教程链接)

    整个摄像头捕获在 C++ 中归结为几行代码:

    > #include "opencv2/core/core.hpp"
    > #include "opencv2/imgproc/imgproc.hpp"
    > #include "opencv2/highgui/highgui.hpp"
    > 
    > using namespace cv;
    > 
    > int main() {
    >     VideoCapture cap(0); // get first cam
    >     while( cap.isOpened() )
    >     {
    >         Mat frame;
    >         if ( ! cap.read(frame) ) // cam might need some warmup
    >             continue;
    > 
    >         // your processing goes here
    > 
    >         imshow("lalala",frame);
    >         if ( waitKey(10)==27 )
    >             break;
    >     }
    >     return 0; }
    

    您的代码在下面向我返回此错误,是否可能显示我的代码块设置中的链接失败?:

    C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x35): 未定义 参考cv::VideoCapture::VideoCapture(int)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x57): undefined reference tocv::VideoCapture::read(cv::Mat&)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x7b): 未定义 参考cv::_InputArray::_InputArray(cv::Mat const&)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0xb5): undefined reference tocv::imshow(std::string const&, cv::_InputArray const&)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0xd5): 未定义 参考cv::waitKey(int)' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x109): undefined reference tocv::VideoCapture::isOpened() const' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x120): 未定义 参考cv::VideoCapture::~VideoCapture()' C:\Users\PTOSH\Documents\tried.o:tried.cpp:(.text+0x162): undefined reference tocv::VideoCapture::~VideoCapture()'

    感谢您的帮助。

    【讨论】:

    • 请尽量不要每次都做出新的答案,它会变得很混乱。并且 - 您需要链接 opencv_core、opencv_highgui 库。
    • 我从 vc10、vc11、vc12 文件中链接了所有 *.lib,但它仍然无法正常工作?
    • 您必须使用 mingw 库(可能是 .a)。它们甚至可能不存在,- 您是否首先构建 opencv 库? afaik,248 不再附带 prebuild mingw
    • 好的,我构建它,链接它,现在它可以工作了!谢谢你的帮助和耐心!
    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多