顔を検出するために OpenCV の Cascade Classifier を使用しています。Webcam のチュートリアルに従い、detectMultiScale を使用して、ラップトップの Webcam からビデオをストリーミングしている間に自分の顔を見つけて追跡することができました。
しかし、ラップトップの Web カメラから自分の写真を撮るとき、その画像を OpenCV にロードし、その画像に detectMultiScale を適用すると、何らかの理由で、カスケード分類子はその静止画像の顔を検出できません!
その静止画像は、ウェブカメラ ストリームからの 1 フレームであれば確実に検出されたはずですが、その 1 枚の画像を単独で撮影すると、何も検出されません。
これが私が使用するコードです(関連する行を選んだだけです):
共通のコード:
String face_cascade_name = "/path/to/data/haarcascades/haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
Mat imagePreprocessing(Mat frame) {
Mat processed_frame;
cvtColor( frame, processed_frame, COLOR_BGR2GRAY );
equalizeHist( processed_frame, processed_frame );
return processed_frame;
}
Web カメラ ストリーミングの顔検出の場合:
int detectThroughWebCam() {
VideoCapture capture;
Mat frame;
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading face cascade\n"); return -1; };
//-- 2. Read the video stream
capture.open( -1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }
while ( capture.read(frame) )
{
if(frame.empty()) {
printf(" --(!) No captured frame -- Break!");
break;
}
//-- 3. Apply the classifier to the frame
Mat processed_image = imagePreprocessing( frame);
vector<Rect> faces;
face_cascade.detectMultiScale( processed_frame, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT, Size(30, 30) );
if (faces.size() > 0) cout << "SUCCESS" << endl;
int c = waitKey(10);
if( (char)c == 27 ) { break; } // escape
}
return 0;
}
私の静止画像の顔検出の場合:
void staticFaceDetection() {
Mat image = imread("path/to/jpg/image");
Mat processed_frame = imagePreprocessing(image);
std::vector<Rect> faces;
//-- Detect faces
face_cascade.detectMultiScale( processed_frame, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT, Size(30, 30) );
if (faces.size() > 0) cout << "SUCCESS" << endl;
}
私の目には、これらのプロセスはどちらも同じですが (唯一の違いは、元の画像を取得する場所です)、ビデオ ストリーム バージョンは定期的に顔を検出しますが、静的メソッドは顔を見つけることができないようです。
ここで何か不足していますか?