我正在尝试使用opencv的CascadeClassifier进行人脸检测。 以下是我正在运行的opencv docs教程的简化代码。
我遇到的问题是对CascadeClassifier::detectMultiScale()
的调用不会返回(至少在第一帧20分钟后没有)。什么可能导致这种行为以及如何解决它?
当我使用预先训练的LBP模型运行相同的代码时,分类器运行速度很快,没有任何问题。然而,当我取消注释equalizeHist()
调用时,正如教程中使用的那样,LBP模型卡住了,类似于Haar模型。
在对类似问题的回答中,我已经读过,当没有面部存在时,分类器可能会花费很长时间。 由于背景较暗,使用均衡的直方图,凸轮上的脸变得有些过度曝光。也许这可能是问题的一部分?
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
using namespace cv;
int main(int argc, const char* argv[])
{
CascadeClassifier face_cascade;
if(!face_cascade.load("haarcascade_frontalface_alt.xml"))
return -1;
VideoCapture capture(0);
if (!capture.isOpened())
return -1;
UMat frame, frame_gray;
for (;;) {
capture >> frame;
if (!frame.empty()) {
cvtColor(frame, frame_gray, CV_BGR2GRAY);
//equalizeHist(frame_gray, frame_gray); // uncomment and LBP gets stuck too
std::vector<Rect> faces;
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30));
for(size_t i = 0; i < faces.size(); ++i) {
Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
ellipse(frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0);
}
}
imshow("Face detection", frame);
if(waitKey(10) > 0)
break;
}
return 0;
}