赞
踩
上篇进行了人脸的检测,现在进行人脸的识别,采用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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。