有没有会Qt+Opencv人脸识别的兄弟 求帮忙改代码!有偿 越快越好
有了它就可以开始进行识别了,也就不再新建工程了,其它代码和上一小节的工程中代码一致,只是修改了readFarme()方法如下,里面有些路径需要修改成自己电脑中文件所在路径:
//读取摄像头信息
void MainWindow::readFarme()
{
capture>>cap; //读取当前帧
if (!cap.empty()) //判断当前帧是否捕捉成功 **这步很重要
{
cvtColor(cap, cap_gray, CV_BGR2GRAY); //转为灰度图
equalizeHist(cap_gray, cap_gray); //直方图均衡化,增加对比度方便处理
if (!face_cascade.load("D:\\openCV3_2\\opencv-3.2.0\\data\\haarcascades\\haarcascade_frontalface_alt.xml"))
{
qDebug("Load haarcascade_frontalface_alt failed!");
return;
}
Ptr<FaceRecognizer> modelPCA = createEigenFaceRecognizer();
modelPCA->load("E:\\workspace\\Qt_workspace\\build-face-Desktop_Qt_5_11_1_MinGW_32bit-Debug\\MyFacePCAModel.xml");//加载分类器
if (!eye_Classifier.load("D:\\openCV3_2\\opencv-3.2.0\\data\\haarcascades\\haarcascade_eye.xml")) //需要将xml文档放在自己指定的路径下
{
qDebug("Load haarcascade_eye.xml failed!");
return;
}
//检测关于脸部位置
face_cascade.detectMultiScale(cap_gray, faceRect, 1.1, 3, 0 | CV_HAAR_DO_ROUGH_SEARCH, Size(50, 50));//检测
for (size_t i = 0; i < faceRect.size(); i++)
{
rectangle(cap, faceRect[i], Scalar(0, 255, 0)); //用绿色矩形画出检测到的位置
Mat faceROI = cap_gray(faceRect[i]);
int predictPCA = 0;
Mat face_test;
Point text_lb;
// 不加前面的cv::的话resize()方法会和MainWindow中的resize()冲突。
cv::resize(faceROI,face_test,Size(92, 112));
imshow("frame", face_test);
//测试图像应该是灰度图
predictPCA = modelPCA->predict(face_test);
qDebug("%d",predictPCA);
if(predictPCA==3) // 这个3也就是上面labels.push_back(3);和图片是一一对应的
{
string name = "xufan"; // 文本提示
text_lb = Point(faceRect[i].x, faceRect[i].y);
putText(cap, name, text_lb, FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255));
}
//imshow("frame", faceROI);
//检测关于眼睛部位位置
int eye_num=0;
eye_Classifier.detectMultiScale(faceROI, eyeRect, 1.1, 1, 0 | CV_HAAR_DO_ROUGH_SEARCH, Size(30, 30));//检测
for (size_t j = 0; j < eyeRect.size(); j++)
{
Rect rect(faceRect[i].x + eyeRect[j].x, faceRect[i].y + eyeRect[j].y, eyeRect[j].width, eyeRect[j].height);
rectangle(cap, rect, Scalar(255, 0, 0)); //用蓝色矩形画出检测到的位置
eye_num++;
if(eye_num==2)
break;
}
}
imag = Mat2QImage(cap); // 将Mat转换成QImage对象来显示
imag = imag.scaled(ui->camera->width(), ui->camera->height(),
Qt::IgnoreAspectRatio, Qt::SmoothTransformation);//设置图片大小和label的长宽一致
ui->camera->setPixmap(QPixmap::fromImage(imag)); // 将图片显示到label上
}
else
qDebug("can not ");
}
运行过后就会出现就可以识别到视频中的人脸:
在这里无法提供直接的代码帮助,但是可以给出解决问题的步骤:
确定问题出在哪里: 对于人脸识别的问题,首先需要看一下代码中是否涉及OpenCV相关的函数,然后确定问题的出现位置和错误信息。
检查环境变量: OpenCV在安装过程中需要添加环境变量,如果这个过程没有完成或者有误,可能会影响程序的正常运行。可以按照参考资料中的步骤检查环境变量是否设置正确。
检查库文件的链接: 人脸识别需要使用到一些相关的库文件,需要在Qt的项目中进行链接。检查一下项目中是否链接了OpenCV的库文件,并且链接方式是否正确。
检查代码: 如果以上两个步骤都没有问题,那么就需要检查代码本身。具体的问题视情况而定,可能是代码逻辑有误、函数参数传递有误等等。
调试和打印信息: 在解决问题的过程中,可以加入一些调试信息和打印语句,帮助定位问题。可以使用Qt的调试工具和输出语句。
总之,解决问题需要耐心和细心。根据实际情况逐步排查,找到问题所在,再进行调整和修改。