【问题标题】:undefined reference to cv::calcOpticalFlow未定义对 cv::calcOpticalFlow 的引用
【发布时间】:2014-06-24 17:30:45
【问题描述】:

编辑 嘿,

对于遇到类似问题的其他人,我想出了一些解决办法。如果你只是编译这个使用:

gcc `pkg-config --cflags opencv` CameraMotionTest.cpp `pkg-config --libs opencv` -o cammotion 

而不是我使用的 makefile,它可以正确编译。我不确定我之前使用的方法有什么问题,所以如果有人仍然想对此发表评论,请继续。

这样做之后,我在代码中发现了一些需要修复的其他问题,但这些问题与这个问题没有任何关系,所以我不会在这里讨论它们。

谢谢!

原创

我正在尝试使用 openCV 在 Ubuntu 上编译用于相机运动估计的短代码,但我遇到了 openCV 函数之一(并且只有一个)的“未定义参考”错误。我尝试编译时遇到的错误如下:

g++ CameraMotionTest.cpp -lopencv_video -lopencv_calib3d -lopencv_imgproc -lopencv_objdetect -lopencv_features2d -lopencv_core -lopencv_highgui -lopencv_videostab   -lopencv_contrib -lopencv_flann -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_gpu -lopencv_ocl -o CameraMotion
/tmp/ccdHB3Pr.o: In function `main':

CameraMotionTest.cpp:(.text+0x77f): undefined reference to `cv::calcOpticalFlowPyrLK(cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray 
const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::Size_<int>, int, cv::TermCriteria, int, double)'
collect2: ld returned 1 exit status
make: *** [CameraMotion] Error 1

我正在使用这个 makefile 来尝试编译和运行程序:

all: run

run: CameraMotion
    ./CameraMotion *.jpg

CameraMotion: CameraMotionTest.cpp
    g++ CameraMotionTest.cpp -lopencv_video -lopencv_calib3d -lopencv_imgproc -lopencv_objdetect -lopencv_features2d -lopencv_core -lopencv_highgui -lopencv_videostab   -lopencv_contrib -lopencv_flann -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_gpu -lopencv_ocl -o CameraMotion

最后,我要编译的代码是:

#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/video/tracking.hpp>
#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <iostream>
#include <stdio.h>
#include <fstream>

using namespace std;
using namespace cv;


int main(int argc, const char** argv){
    //storing the image in a temporary variable
    vector<Mat> img;
    int noi=5;
    for( int index=0; index<noi;index++){
        img.push_back(imread(argv[index+1]));
    }
    Mat im1=img[0];
    //converting image to grayscale
    cvtColor(im1,im1,CV_RGB2GRAY);
    //initializing variable
    vector<Point2f> corners1, corners2;
    //setting parameters for corner detection
        int maxCorner=200;
        double quality=0.01;
        double minDist=20;
        int blockSize=3;
        double k=0.04;
        Mat mask;
        vector<uchar> status;
        vector<float> track_err;
        int maxlevel=3;
        Mat im2=img[1];
        TermCriteria termcrit(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS,20,.03);
        vector<Point2f> pointskept1,pointskept2;
        vector<int>pointskeptindex;
        Mat F,E,R,tran;
        Matx33d W(0,-1,0,
                  1,0,0,
                  0,0,1);
        Matx33d Winv(0,1,0,
                    -1,0,0,
                     0,0,1);
        OutputArray statF=noArray();
        float fx=951.302687761842550;
        float fy=951.135570101293520;
        float cx=484.046807724895250;
        float cy=356.325026020307800;
        float alpha=0;
        float kmatdata[3][3]={{fx,fy*tan(alpha),cx},{0,fy,cy},{0,0,1}};
        Mat K(3,3,CV_32FC1,kmatdata);
        cout<<K<<endl;

        ofstream myfile;
    //collecting new images, determining corners, and calculating optical flow
    for (int i=1; i<noi-1; i++) {
        //capturing next image

        //converting new image to grayscale
        cvtColor(im2,im2,CV_RGB2GRAY);
        //determining corner features
        goodFeaturesToTrack(im1,corners1, maxCorner, quality, minDist, mask, blockSize, false,k);
        goodFeaturesToTrack(im2,corners2, maxCorner, quality, minDist, mask, blockSize, false,k);
        //calculating optical flow
        calcOpticalFlowPyrLK(im1,im2,corners1,corners2,status,track_err,Size(10,10),maxlevel,termcrit,0.0001);
        //filtering points
        for(int t=0; t<status.size();i++){
            if(status[t] && track_err[i]<12.0){
                pointskeptindex.push_back(i);
                pointskept1.push_back(corners1[i]);
                pointskept2.push_back(corners2[i]);
            } else {
                status[i]=0;
            }
        }

        F=findFundamentalMat(pointskept1,pointskept2,FM_RANSAC,1,0.99,statF);

        E=K.t()*F*K;

        SVD svd(E);

        R=svd.u*Mat(W)*svd.vt;
        tran=svd.u.col(2);

        //renaming new image to image 1
        im2.copyTo(im1);
        im2=img[i+1];
        myfile.open("output.txt", ios_base::app);
        myfile<<"Rotation mat: ";
        for(int l=0;l<R.rows;l++){
            for(int m=0; m<R.cols; m++){
                myfile<<R.at<float>(i,m)<<", ";
            }
        }
        myfile<<"Translation vector: ";
        for(int l=0; l<tran.rows;l++){
            myfile<<tran.at<float>(l,1)<<", ";
        }
        myfile<<"\n";
        myfile.close();

    }


    return 0;
}

还有其他人遇到过这样的问题吗?我假设某处只是一个链接错误,但坦率地说,我对 opencv 和 c++ 总体来说还很陌生,而且我还无法找出问题所在。

谢谢! 安德鲁

【问题讨论】:

  • 在最后一个参数之前缺少int flag(看起来你跳过了一个)
  • OutputArray 应该是一个普通的Mat
  • 嘿,谢谢您的回复。我解决了您指出的第一个问题,但不确定您对第二个问题的意思。你能详细说明一下吗?你说哪个值需要是 Mat 类型?
  • 抱歉忽略。意思是OutputArray statF=noArray();,但你甚至没有在任何地方使用它
  • 你有哪个版本的 OpenCV?

标签: c++ opencv ubuntu undefined-reference


【解决方案1】:

您的 OpenCV 安装似乎有些问题。要编译您的代码,在 OpenCV 2.4.9 上,使用就足够了

g++ t1.cpp -lopencv_video -lopencv_core -lopencv_objdetect -lopencv_imgproc  -lopencv_highgui -lopencv_calib3d -o CameraMotion

您也可以尝试使用nm -g &lt;library&gt; | grep -i &lt;function_name&gt; 检查您的 libopencv_video.so 是否包含 calcOpticalFlowPyrLK...(基于this 的答案)。

【讨论】:

  • 嘿,我以为是这样,所以我也认为我的opencv灌输有问题;但是,正如我在上面的答案中提到的,使用不同的命令行参数似乎可以解决所有问题。我不知道为什么会这样,但至少我有一个解决方案:)。
  • 谢谢你的回答顺便说一句!
【解决方案2】:

对于遇到类似问题的其他人,我想出了一些解决办法。如果你只是编译这个使用:

gcc `pkg-config --cflags opencv` CameraMotionTest.cpp `pkg-config --libs opencv` -o cammotion 

而不是我使用的 makefile,它可以正确编译。我不确定我之前使用的方法有什么问题,所以如果有人仍然想对此发表评论,请继续。

这样做之后,我在代码中发现了一些需要修复的其他问题,但这些问题与这个问题没有任何关系,所以我不会在这里讨论它们。

谢谢!

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多