4.3 利用openCV实现人脸识别

这节课,我们再来看一个简单且实用的例子:人脸识别。这个小例子可以让你进一步领略openCV的强悍。

一、最终效果

二、实现原理

openCV可以加载预训练好的人脸识别模型,可以快速识别出图像中的人脸。

三、实现过程

1.复制demo4.2并改名为demo4.3。

2.修改capImg函数:

int fmle::capImg() {

    // 加载人脸检测分类器

    cv::CascadeClassifier faceCascade;

    faceCascade.load("E:\\SDK\\opencv-sdk\\data\\haarcascades\\haarcascade_frontalface_default.xml");

    cv::Mat image;

    image = cv::imread("girl.jpg");

    // 将图像转换为灰度图像

    cv::Mat grayImage;

    cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

    // 进行人脸检测  

    faceCascade.detectMultiScale(grayImage, faces, 1.1, 3, 0, cv::Size(30, 30));

    // 在图像上绘制检测到的人脸

    for (const auto& face : faces) {

         cv::rectangle(image, face, cv::Scalar(0, 255, 0), 2);

    }

    mainDlg->drawMatOfPub(image);

    return 0;

}

3.调试运行,当人脸被检测到时会在人脸周围显示绿框。

4.当然也可以实时检测摄像头中的人脸,流程与图片检测差不多,修改capCam函数:

int fmle::capCam() { 

    // 加载人脸检测分类器

    cv::CascadeClassifier faceCascade;

    faceCascade.load("E:\\SDK\\opencv-sdk\\data\\haarcascades\\haarcascade_frontalface_default.xml");

    videoCap.open(0);

    while (true)

    {

         cv::Mat image;

         BOOL ifSuccess = videoCap.read(image);

         // 将图像转换为灰度图像

         cv::Mat grayImage;

         cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

         // 进行人脸检测

         faceCascade.detectMultiScale(grayImage, faces, 1.1, 3, 0, cv::Size(30, 30));

         // 在图像上绘制检测到的人脸

         for (const auto& face : faces) {

             cv::rectangle(image, face, cv::Scalar(0, 255, 0), 2);

         }

         mainDlg->drawMatOfPub(image);

        Sleep(40);

    }

    videoCap.release();

    return 0;

}

当然,这个算法也不是尽善尽美,有时候也会识别失败。

更多推荐