人脸检测 OpenCV + Qt + cvMat

Posted

技术标签:

【中文标题】人脸检测 OpenCV + Qt + cvMat【英文标题】:face detect OpenCV + Qt + cvMat 【发布时间】:2015-10-06 20:05:07 【问题描述】:

我正在尝试将旧的 opencv 面部检测代码从使用 IplImage 结构迁移到使用来自 opencv 的 Mat 类。

问题是当没有 Qt 代码时代码正在运行。 这是codelite中的蛮力C++代码:

void detectFace(Mat& img)

    std::vector<Rect> faces;
    Mat gray;
    cvtColor(img, gray, CV_BGR2GRAY);
    equalizeHist(gray, gray);
    // Face detect
    face_cascade.detectMultiScale(gray, faces, 1.1, 2,1 | CV_HAAR_SCALE_IMAGE, Size(100,100));
for (unsigned int i = 0; i < faces.size(); i++)

    //face detect rectangle
    Point upperLeftFace(faces[i].x, faces[i].y);
    Point lowerRightFace(faces[i].x+faces[i].width, faces[i].y+faces[i].height);
    rectangle(/*Matrice*/img, /*Rect*/upperLeftFace, /*Rect*/lowerRightFace, /*BGR Color*/Scalar(255, 255,0), /*Line height*/1, /*line type*/8);


//Show window
namedWindow("Alexey Eye", CV_WINDOW_AUTOSIZE);
imshow("Alexey Eye", img);

这是我使用 qt 时的代码:

void Neski::m_faceDetect()

    *att_CamCapture >> att_MatCamera;
    std::vector<Rect> faces;
    Mat grayMat;
    cvtColor(att_MatCamera, grayMat, CV_BGR2GRAY);
    equalizeHist(grayMat, grayMat);
    // Face detect
    face_cascade.detectMultiScale(grayMat, faces, 1.1, 2,1 | CV_HAAR_SCALE_IMAGE, Size(150,150));
    for (unsigned int i = 0; i < faces.size(); i++)
    
        //face detect rectangle
        Point upperLeftFace(faces[i].x, faces[i].y);
        Point lowerRightFace(faces[i].x+faces[i].width, faces[i].y+faces[i].height);
        rectangle(/*Matrice*/att_MatCamera, /*Rect*/upperLeftFace, /*Rect*/lowerRightFace, /*BGR Color*/Scalar(255, 255,0), /*Line height*/1, /*line type*/8);
    
    cvtColor(att_MatCamera, att_MatCamera, CV_BGR2RGB);
    QImage att_QImageCamera((uchar*) att_MatCamera.data, att_MatCamera.cols, att_MatCamera.rows, att_MatCamera.step, QImage::Format_RGB888);
    *att_PixImageCamera = QPixmap::fromImage(att_QImageCamera.scaled(640, 480),Qt::AutoColor);
    att_ui->lab_image->setPixmap(*att_PixImageCamera);

两个代码几乎相同,但我不知道为什么启动程序时没有面部检测。它确实向我显示了来自网络摄像头的视频,但没有面部检测矩形。

有人有什么想法吗?

【问题讨论】:

【参考方案1】:

经过几个小时的睡眠和新鲜的想法,我让它工作了。 这是一个愚蠢的错误,我忘记加载用于检测面部的级联。 这就是为什么没有错误也没有矩形。

face_cascade.load(face_cascade_name);

只要把它放在行前:

face_cascade.detectMultiScale(grayMat, faces, 1.1, 2,1 | CV_HAAR.......

现在可以了。 但是,仍然感谢您提供的出色网站。

Here is a screenshoot of the final result

【讨论】:

以上是关于人脸检测 OpenCV + Qt + cvMat的主要内容,如果未能解决你的问题,请参考以下文章

opencv运动车里检测跟踪轨迹不对

基于QT和OpenCV的人脸检测识别系统

基于QT和OpenCV的人脸检测识别系统

基于opencv和qt的人脸检测小系统

Qt+OpenCV联合开发(二十九)--实时人脸检测案例

如何以及在何处使用带有 QT 的 basler 相机实现 opencv 人脸检测代码