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的基础上进行简化,生成以下测试文件:

  1. 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,
            &quot;Usage: facedetect &#91;--cascade=\&quot;<cascade_path>\&quot;&#93;\n&quot;
            &quot;   &#91;--nested-cascade&#91;=\&quot;nested_cascade_path\&quot;&#93;&#93;\n&quot;
            &quot;   &#91;--scale&#91;=<p_w_picpath scale>\n&quot;
            &quot;   &#91;filename|camera_index&#93;\n&quot; );
            return -1;
        }
        return 0;
    }
  2. #include &quot;cxcore.h&quot;
    #include &quot;cvtypes.h&quot;
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    const char* cascade_name =
        &quo

编译

  1. gcc -L/work/books/opencv/dist/lib -lcv -lhighgui -lcxcore -o facedetect facedetect.o



执行

  1. LD_LIBRARY_PATH=/work/books/opencv/dist/lib ./facedetect


结果正常,没有报错。

然后,我看了一下cvLoad函数在哪个库里边,显然,是cxcore,而我的facedetect.c又只用到了opencv的这一个函数,因此,我精简编译命令,变成

  1. gcc -L/work/books/opencv/dist/lib -lcxcore -o facedetect facedetect.o


执行

  1. 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...
  2. 段错误



竟然,出现了传说中的错误。为了确认这一点,我再修改编译命令:

  1. gcc -L/work/books/opencv/dist/lib -lcv -o facedetect facedetect.o