上篇完成了Qt调用OpenCV的摄像头,接下来要做的是基于拍摄到的图片进行人脸检测。使用OpenCV的级联检测器HAAR人脸检测,首先在Qt的初始化函数中加载人脸模型:
//初始化
void Widget::Init()
{
//加载人脸检测模型
if(!faceDetector.load("../facerecog2/haarcascade_frontalface_alt.xml"))
{
qDebug() << "--(!)Error loading";
return;
}
}
人脸模型位于编译的链接库中,路径为D:\Program\opencv3.2\newbuild\install\etc\haarcascades\haarcascade_frontalface_alt.xml,依然在打开摄像头槽函数中添加代码,代码参考了官方的人脸检测代码:
//打开摄像头
void Widget::on_btn_open_clicked()
{
//打开摄像头
if (capture.isOpened())
return;
capture.open(0);
if(capture.isOpened())
{
for(;;)
{
capture >> frame;
flip(frame, frame, 1); //画面翻转
if (!frame.empty())
{
//人脸检测
Mat frame_gray;
Mat dst;
Mat testSample;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
faceDetector.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (int i = 0; i < faces.size(); i++)
{
rectangle(frame, faces[i], Scalar(0, 0, 255), 1, 8, 0);
}
//显示
image = Mat2QImage(frame);
ui->label->setPixmap(QPixmap::fromImage(image));
}
Sleep(10); //延时10ms
}
}
效果如下所示,很好的框出了人脸: