我正在使用 OpenCV 的级联分类器来检测人脸。我按照网络摄像头教程进行操作,当它从笔记本电脑的网络摄像头流式传输视频时,我能够使用 detectMultiScale 来查找和跟踪我的脸。
但是当我从笔记本电脑的网络摄像头拍摄自己的照片时,我将该图像加载到 OpenCV 中,并在该图像上应用 detectMultiScale,由于某种原因,级联分类器无法检测到该静态图像上的任何人脸!
如果它是来自我的网络摄像头流的一帧,那么肯定会检测到该静态图像,但是当我只拍摄一张单独的图像时,什么都没有被检测到。
这是我使用的代码(刚刚挑选出相关行):
共同代码:
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;
}
对于网络摄像头流式人脸检测:
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;
}
在我看来,这两个过程是相同的(唯一的区别是我获取原始图像的位置),但是视频流版本会定期检测人脸,而静态方法似乎永远无法找到人脸。
我在这里错过了什么吗?