2

このチュートリアルのコードを使用しました: http://opencvlover.blogspot.co.uk/2012/11/face-detection-in-javacv-using-haar.html

別の画像を読み取り、顔検出を試みる前にこの画像を表示するように少し変更されています ( 14行目)。これにより、イメージが正しく読み込まれていることを確認できます。

エラーは23行目で発生します。完全なエラー コードは次のとおりです。

OpenCV Error: Null pointer (Invalid classifier cascade) in cvHaarDetectObjectsForROC,file ..\..\..\..\opencv\modules\objdetect\src\haar.cpp, line 1514 
Exception in thread "main" java.lang.RuntimeException: ..\..\..\..\opencv\modules\objdetect\src\haar.cpp:1514: error: (-27) Invalid classifier cascade in function cvHaarDetectObjectsForROC

at com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(Native Method)
at com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(opencv_objdetect.java:238)
at FaceDetection.detect(FaceDetection.java:23)
at FaceDetection.main(FaceDetection.java:15)

ここに私の完全なプログラムがあります:

import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import static com.googlecode.javacv.cpp.opencv_objdetect.*;

public class FaceDetection{

public static final String XML_FILE = 
        "resources/haarcascade_frontalface_default.xml";

public static void main(String[] args){

    IplImage img = cvLoadImage("pic.jpg");      
    cvShowImage("",img);cvWaitKey(0);
    detect(img);        
}   

public static void detect(IplImage src){

    CvHaarClassifierCascade cascade = new 
            CvHaarClassifierCascade(cvLoad(XML_FILE));
    CvMemStorage storage = CvMemStorage.create();
    CvSeq sign = cvHaarDetectObjects(
            src,
            cascade,
            storage,
            1.5,
            3,
            CV_HAAR_DO_CANNY_PRUNING);

    cvClearMemStorage(storage);

    int total_Faces = sign.total();     

    for(int i = 0; i < total_Faces; i++){
        CvRect r = new CvRect(cvGetSeqElem(sign, i));
        cvRectangle (
                src,
                cvPoint(r.x(), r.y()),
                cvPoint(r.width() + r.x(), r.height() + r.y()),
                CvScalar.RED,
                2,
                CV_AA,
                0);

    }

    cvShowImage("Result", src);
    cvWaitKey(0);

    }           
}

このエラーの原因、または修正方法を知っている人はいますか? ありがとう!

4

2 に答える 2

2

解決おめでとうございます。ただし、進歩して学ぶためには、何が悪かったのかを理解する必要があります。

プログラムがカスケード分類子を見つけることができないため、エラーが発生しました。分類子の場所を間違って宣言したと思いましたが、そもそも分類子を持っていなかったことがわかりました。サンプルの分類子をダウンロードして使用することで、これを解決しました。

プログラムを含むフォルダーに分類子を配置する必要はありません。別の場所に配置して、分類子が配置されている場所のパスを指定することもできます。

オブジェクト検出に本当に興味がある場合は、独自の haar-classifier をトレーニングすることもお勧めします。これは、カスケード分類器がどのように機能するかをよりよく理解するのに役立ちます。

于 2014-02-11T04:19:59.823 に答える
2

解決しました!

「haarcascade_frontalface_default.xml」をグーグルで検索し、ダウンロードしてワークスペースのフォルダーに貼り付け、XML文字列のファイル名から /resources/ を削除したところ、機能しました。

于 2014-02-10T18:22:30.487 に答える