上篇进行了人脸的检测,现在进行人脸的识别,采用OpenCV的face320模块里的EigenFace算法。在进行检测之间,得制作被检测人的人脸数据,这是捕获按钮就起到了作用,进行人脸数据的拍摄,
//拍摄人脸
void Widget::on_btn_cap_clicked()
{
Mat dst;
for (int i = 0; i < faces.size(); i++)
{
cv::resize(frame(faces[i]), dst, Size(92, 112));
cvtColor(dst,dst,COLOR_BGR2RGB);
imwrite(format("../myFace/%d.jpg", count), dst);
count++;
}
}
如代码所示,拍摄的人脸数据大小都为112*92,拍摄10到20张图片,进行数据筛选,选则好的数据集进行训练,然后进行实时监测,同样在打开摄像头槽函数中添加代码:
//延时函数
void Widget::Sleep(int msec)
{
QTime dieTime = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
//打开摄像头
void Widget::on_btn_open_clicked()
{
//打开摄像头
if (capture.isOpened())
return;
capture.open(0);
if(capture.isOpened())
{
//int rate= capture.get(CV_CAP_PROP_FPS); //获取帧率
//qDebug() << "rate=" << rate;
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++)
{
Mat roi = frame(faces[i]);
cvtColor(roi, dst, COLOR_BGR2GRAY);
cv::resize(dst, testSample, Size(92, 112));
int label = model->predict(testSample);
rectangle(frame, faces[i], Scalar(0, 0, 255), 2, 8, 0);
putText(frame, format("i'm %s", (label == 36 ? "Howard" : "Unknow")),
faces[i].tl(), FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 255), 2, 8);
//qDebug() << "label:" << label;
}
//显示
image = Mat2QImage(frame);
ui->label->setPixmap(QPixmap::fromImage(image));
}
Sleep(2); //延时2ms
}
}
}
注意点:
最后的结果如下:
最后附上整个工程代码: https://download.csdn.net/download/huhuandk/10821182