CalcOpticalFlowFarneback函数生成错误->;OpenCV->;C语言-Eclipse->;马科斯

CalcOpticalFlowFarneback函数生成错误->;OpenCV->;C语言-Eclipse->;马科斯,c,eclipse,macos,opencv,opticalflow,C,Eclipse,Macos,Opencv,Opticalflow,我必须用C语言和OpenCV库为一个项目做一个程序, 我遵循了在该站点上安装MACOSX的指南: 我使用Mac端口进行iInstallation 我用Eclipse编程, 现在,当我试图编译这个程序时,我得到了一个构建错误,我认为这取决于CalcOpticalFlowFarneback()函数 代码如下: #include <stdio.h> #include <cv.h> #include <highgui.h> #include

我必须用C语言和OpenCV库为一个项目做一个程序, 我遵循了在该站点上安装MACOSX的指南:

我使用Mac端口进行iInstallation

我用Eclipse编程, 现在,当我试图编译这个程序时,我得到了一个构建错误,我认为这取决于CalcOpticalFlowFarneback()函数

代码如下:

 #include <stdio.h>
    #include <cv.h>
    #include <highgui.h>
    #include <math.h>
    #include <time.h>


int main(){



    CvCapture* webcam = cvCreateCameraCapture(0);
    IplImage*prev=NULL;
    IplImage*next=NULL;
    char scelta;

    /*INIZIALIZZAZIONE FUNZIONE RAND*/

    srand(time(NULL));


    double pyr_scale=0.5; 
    int levels=1;
    int winsize=3; 
    int iterations=10;
    int poly_n=5; 
    double poly_sigma=1.1;
    int flags=0;

    sleep(2);

    if (!webcam){
    /* Exit with an error */
        puts("Attenzione! si è verificato un Errore in Fase di Attivazione della WebCam. Preghiamo di Riprovare!");
        return -1;
    }


    while (1) {

        prev = cvQueryFrame(webcam);//primi 8-bit single-channel immagine in ingresso
        next = cvQueryFrame(webcam);// immagine secondo ingresso della stessa dimensione e lo stesso tipo prev.

        CvSize isize = cvSize(80,80);
        IplImage *flow = cvCreateImage(isize, IPL_DEPTH_32F, 1); //immagine computerizzata che ha le stesse dimensioni e tipo CV_32FC2 prev
        if ((prev) && (next)) {



            cvCalcOpticalFlowFarneback(prev,next,flow,pyr_scale,levels,winsize,iterations,poly_n,poly_sigma,flags);

            scelta=cvWaitKey(20);
            if((char)scelta == 27){

                break;
            }


        }


    }

    cvDestroyWindow("VIDEO SORVEGLIANZA");
    cvReleaseCapture(&webcam);

    return 0;
}
我想指定,如果我删除cvCalcOpticalFlowFarneback函数,我就不会有任何问题

谢谢,

manu.web

“未定义的符号”表示您没有链接到正确的库,或者您已经链接了,但该库用于错误的体系结构(例如,当您的机器为64位时为32位库)

您需要检查链接标志和路径,以及库安装路径

如果可以在Eclipse中获取链接器日志和/或传递给链接器的命令行,则可以从终端重复链接命令,并查看是否获得更有用的消息(例如“library not found”)。或者您可以尝试从终端运行
make
命令,并执行相同的操作

编辑Makefile时,您可能会发现某些命令前面带有“@”符号,这会阻止它们被输出(它们的输出可见,而命令本身不可见)。您通常可以安全地删除@,并获得更详细的输出

另一种可能性是存在名称损坏错误,并且函数的“\u1”前缀不应存在。不过,我对Eclipse不太熟悉,所以我无法跟随你。但见例;您可能使用错误的选项构建了OpenCV,因此现在它与您的代码不兼容。这是很奇怪的,看看你如何调用其他OpenCV函数没有问题;但是,也许您可以分两步构建OpenCV

通常(这不限于OpenCV!)您将有一个构建命令,如

gcc -I/usr/local/include/opencv -L/usr/local/lib main.c -o Cattura_foto2 \
-lopencv_core.2.4.3 \
-lopencv_imgproc.2.4.3 \
-lopencv_highgui.2.4.3 \
-lopencv_gpu.2.4.3
和一个错误,该错误抱怨未定义的符号:

Undefined symbols for architecture x86_64: "_cvCalcOpticalFlowFarneback"
这意味着您正在链接openvc_core.2.4.3等库,而链接器找不到符号“_cvCalcOpticalFlowFarneback”

在计算机上找到这些库,并对找到的所有库运行(从终端)以下命令注意:您的路径可能会有所不同。我有/usr/lib64

for lib in /usr/lib64/libopencv_*; do 
    echo "Examining $lib..."
    strings $lib | grep -i cvCalcOpticalFlowFarneback
done
你应该看到这样的东西:

Examining /usr/lib/libopencv_pippo_pluto...
Examining /usr/lib/libopencv_blah_blah...
...
Examining /usr/lib64/libopencv_video.so...
cvCalcOpticalFlowFarneback
cvCalcOpticalFlowFarneback
Examining /usr/lib64/libopencv_video.so.2.4...
cvCalcOpticalFlowFarneback
cvCalcOpticalFlowFarneback
Examining /usr/lib64/libopencv_video.so.2.4.3...
cvCalcOpticalFlowFarneback
cvCalcOpticalFlowFarneback
多个匹配的原因是库存在于多个符号副本中

当然,让我们检查一下库:

nm -D /usr/lib64/libopencv_video.so.2.4 | grep Farneback

0000000000027e50 T cvCalcOpticalFlowFarneback
现在我们知道了两件重要的事情:

  • 该符号实际上被称为
    cvCalcOpticalFlowFarneback
    。您的GCC正在抱怨它找不到带有下划线的符号
    \u cvCalcOpticalFlowFarneback
    。您可能构建的库不正确,或者缺少GCC的
    -fno前导下划线
    选项
  • 但如果是这样,就根本无法识别OpenCV2符号。所以,我打赌#2:

  • 符号位于libopencv_video.so.2.4.3中,您的build命令中没有对该库的引用!你应该有-lopencv_video.2.4.3或类似的东西。验证makefile和选项

  • 让我知道它是如何运行的——在bocca al-lupo中。

    我使用这个命令行>sudo port install opencv来构建64位的opencv 2.1.0。我在项目属性中指定了正确的路径opt/local/lib和每个特定的库:opencv_gpu.2.4.3,那么我的意思是怎么了?我不明白。。opencv_core.2.4.3 opencv_highgui.2.4.3 opencv_imgproc.2.4.3我也不知道:cvCalcOpticalFlowFarneback确实在库中。编辑答案。我试着用terminal编译,结果如下:MacBook Pro di emanuele:cattura_foto2 emanuelegragnoli$gcc-i/usr/local/include/opencv-L/usr/local/lib main.c-o cattura_foto2-lopencv_core.2.4.3-lopencv_imgproc.2.4.3-lopencv highgui.2.4.3-lopencv_gpu.2.4.3未定义的架构符号x86_64:“_cvCalcOpticalFlowFarneback”,引用自:_mainin ccYUFnom.o ld:symbol未找到架构x86_64 collect2:ld返回1退出状态我认为我们可能已经发现了问题(实际上,我应该早一点这样做)。我在回答中包括了这些情况的一般故障排除过程。
    nm -D /usr/lib64/libopencv_video.so.2.4 | grep Farneback
    
    0000000000027e50 T cvCalcOpticalFlowFarneback