对于一个大学项目我正在为Android做一个手动跟踪算法的端口。阿尔格。主要使用OpenCV功能。老实说,我真的不明白什么是alg。但这不是我的问题。 所以移植alg。我将工作windows visual studio项目中的每个文件添加到我的android项目中,修复了一些编译器警告和错误。大部分成功...... 不幸的是,有一个文件让我担心了很多个小时。 编译此文件会引发以下错误:
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvFindChessBoardCornerGuesses':
compat.cpp:(.text.cvFindChessBoardCornerGuesses+0x18): undefined reference to `cvFindChessboardCorners'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLines':
compat.cpp:(.text.cvHoughLines+0x46): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesSDiv':
compat.cpp:(.text.cvHoughLinesSDiv+0x54): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesP':
compat.cpp:(.text.cvHoughLinesP+0x52): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvCalcEMD':
compat.cpp:(.text.cvCalcEMD+0x44): undefined reference to `cvCalcEMD2'
collect2: ld returned 1 exit status
有趣的是,导致此错误的唯一行是
nPointsConnected ++;
注释此行或递减nPointsConnected或设置类似nPointsConnected = 1的值会使链接器错误消失。
项目中还有其他文件,包括相同的OpenCV头文件编译。 有人可以向我解释一下吗? 请...
EDIT 这是环绕码:
if ( minK > FINGERTIP_ANGLE_THRESHOLD && minDir > 0 )
{
nPointsGap = 0;
if ( nPointsConnected == 0 )
{
startIndex = i;
}
nPointsConnected ++;
if ( minAngle < minK )
{
minAngle = minK;
minPointIndex = i;
}
fConnected = true;
mediumIndex += ( minK * i );
meanPointX += ( minK * contour[i].x );
meanPointY += ( minK * contour[i].y );
sumAngle += minK;
if ( fScreenshot )
{
cvCircle( pScreenshot_curvature, cvPoint(contour[i].x*2, contour[i].y*2),
4, CV_RGB(255,255,0), -1, 8, 0 );
cvCircle( pScreenshot_ellipse, cvPoint(contour[i].x*2, contour[i].y*2),
4, CV_RGB(255,255,0), -1, 8, 0 );
}
}
答案 0 :(得分:1)
这看起来好像你最终从compat.o
引入了-lopencv_legacy
目标文件,就像这个文件委托给另一个实现一样。也就是说,您可能需要在-lopencv
之后指定-lopencv_legacy
。
我对Android或OpenCV一无所知,但这就是错误消息的样子。除非nPointsConnected
是某种类类型,否则您对导致问题的原因的描述看起来有点奇怪。在这种情况下,增量运算符可能仅在兼容性库中实现,而其他操作在“实际”实现中可用。在目标文件上使用nm
,您可以找到您更改的其他符号导致未定义,然后查看它们在哪个库中定义。
答案 1 :(得分:0)
只是为了澄清, 正如有些人认为问题不是增加的整数导致这个错误。 此外,它是if条件中的方法调用
(nPointsConnected > SOMEVALUE)
我要做的是改变OpenCV makefile中OpenCV模块的顺序 从
OPENCV_MODULES := contrib calib3d objdetect features2d video imgproc highgui ml legacy flann core ts
到
OPENCV_MODULES := contrib legacy objdetect calib3d features2d video highgui imgproc ml flann core
遗留模块是要替换的模块。 (非常感谢android-opencv邮件列表中指出这一点的人)