google了一下,发现这几年来,碰到这个问题的人并不少,但却没有一个人愿意深入进去好好分析一下原因的,包括[url:3jrjx97k]http://opencv.willowgarage.com/wiki/FaceDetection[/url:3jrjx97k]给出的解决方案也是凑合,没能找出根本原因,说难听点,是扯蛋。对自己使用的工具如此的不熟悉,试问又怎么可能用的好,就更别说精益求精了。
我一再强调过基本功的重要、细心的重要、认真的重要、代码的重要。。。。。。为什么,因为我从来没有用过opencv,也从来不懂什么图像算法,也从来没看过opencv的代码,也从没用C++写过20行以上的程序。
好吧,我就来分析一下这个问题的形成和解决方案,我没有windows环境,所以下面均以linux环境进行描述。
我用的opencv版本是sf上下载的opencv-1.1pre1.tar.gz
解开之后,编译opencv代码库就不用说了,然后在sample/c/facedetect.c的基础上进行简化,生成以下测试文件:
t;../../data/haarcascades/haarcascade_frontalface_alt.xml"; static CvHaarClassifierCascade* cascade = 0; int main( int argc, char** argv ) { cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); if( !cascade ) { fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); fprintf( stderr, "Usage: facedetect [--cascade=\"<cascade_path>\"]\n" " [--nested-cascade[=\"nested_cascade_path\"]]\n" " [--scale[=<p_w_picpath scale>\n" " [filename|camera_index]\n" ); return -1; } return 0; }
#include "cxcore.h" #include "cvtypes.h" #include <stdio.h> #include <stdlib.h> #include <string.h> const char* cascade_name = &quo
编译
gcc -L/work/books/opencv/dist/lib -lcv -lhighgui -lcxcore -o facedetect facedetect.o
执行
LD_LIBRARY_PATH=/work/books/opencv/dist/lib ./facedetect
结果正常,没有报错。
然后,我看了一下cvLoad函数在哪个库里边,显然,是cxcore,而我的facedetect.c又只用到了opencv的这一个函数,因此,我精简编译命令,变成
gcc -L/work/books/opencv/dist/lib -lcxcore -o facedetect facedetect.o
执行
LD_LIBRARY_PATH=/work/books/opencv/dist/lib ./facedetect OpenCV ERROR: Unspecified error (The node does not represent a user object (unknown type?)) in function cvRead, cxpersistence.cpp(5061) Terminating the application...
段错误
竟然,出现了传说中的错误。为了确认这一点,我再修改编译命令:
gcc -L/work/books/opencv/dist/lib -lcv -o facedetect facedetect.o