gpt4 book ai didi

c - 使用 CalcOpticalFlowFarneback 函数构建错误 -> OpenCV -> C 语言 - Eclipse -> MacOSX

转载 作者:太空宇宙 更新时间:2023-11-03 22:33:44 24 4
gpt4 key购买 nike

我必须为一个项目使用 C 语言和 OpenCV 库编写一个程序,我按照本网站上的 MACOSX 安装指南进行操作: OpenCV Installation

我使用 Mac 端口进行安装。

我使用 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;
}

这是错误日志:

Undefined symbols for architecture x86_64: "_cvCalcOpticalFlowFarneback", referenced from:_main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [cattura_foto] Error 1

我想说明的是,如果我删除 cvCalcOpticalFlowFarneback 函数,我不会有任何问题。

谢谢,

manu.web

最佳答案

“ undefined symbol ”意味着您没有链接到正确的库,或者您已经链接了,但是库用于错误的体系结构(例如,32 位库,而您的机器是 64 位)。

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

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

编辑Makefile,你可能会发现一些命令前面加上了“@”符号,这会阻止它们被输出(它们的输出是可见的,命令本身是不可见的)。您通常可以安全地删除 @'s 并获得更详细的输出。

另一种可能性是存在名称混淆错误,函数的“_”前缀不应该存在。不过我对 Eclipse 不是很熟悉,所以我不能在那里跟你讲。但是请参阅例如http://www.eclipse.org/forums/index.php/m/783606/ ;您可能使用错误的选项构建了 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 symbol 的错误:

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

现在我们知道了两件重要的事情:

  1. 这个符号真的叫做cvCalcOpticalFlowFarneback。您的 GCC 提示它没有找到带有下划线的符号 _cvCalcOpticalFlowFarneback。您要么错误地构建了库,要么缺少 GCC 的 -fno-leading-underscore 选项。

但如果是这种情况,不会识别任何 OpenCV2 符号。所以,我打赌 #2:

  1. 该符号在 libopencv_video.so.2.4.3 中,并且在您的构建命令中没有对该库的引用!你应该有 -lopencv_video.2.4.3 或类似的东西。验证您的 makefile 和选项。

让我知道进展如何 - 在 bocca al lupo

关于c - 使用 CalcOpticalFlowFarneback 函数构建错误 -> OpenCV -> C 语言 - Eclipse -> MacOSX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com