【计算机视觉】使用lbpcascade_frontalface.xml与 haarcascade_eye_tree_eyeglasses.xml配合进行人眼检测的c++程序

66 篇文章 1 订阅
44 篇文章 4 订阅

1.opencv人眼检测概述:

OpenCV 中有多种方法可以用来进行人眼检测,其中常用的有以下几种:

Haar 特征分类器:使用训练好的 Haar 特征分类器来检测人眼。

LBP 特征分类器:使用 LBP 特征分类器来检测人眼。

HOG + SVM:使用 HOG 特征和 SVM 分类器来检测人眼。

CNN 网络:使用卷积神经网络来训练检测模型。

人脸检测+人脸关键点检测: 先使用人脸检测模型检测人脸,在使用人脸关键点检测模型检测人眼。

这里展示的是使用lbpcascade_frontalface.xml与 haarcascade_eye_tree_eyeglasses.xml配合进行人眼检测。

2.详细c++代码

这里先检测摄像头中面积最大的人脸,再在最大人脸中用级联分类器检测人眼,代码如下:

#include <opencv2/objdetect.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 加载人脸和眼睛分类器
    CascadeClassifier faceCascade("lbpcascade_frontalface.xml");
    CascadeClassifier eyeCascade("haarcascade_eye_tree_eyeglasses.xml");

    // 打开摄像头
    VideoCapture capture(0);
    if (!capture.isOpened()) {
        //cout << "摄像头打开失败" << endl;
        return -1;
    }

    // 循环读取每一帧
    while (true) {
        Mat frame;
        capture >> frame;
        if (frame.empty()) {
            //cout << "没有捕获到图像" << endl;
            break;
        }

        // 将图像转化为灰度图像
        Mat gray;
        cvtColor(frame, gray, COLOR_BGR2GRAY);
        equalizeHist(gray, gray);

        // 检测人脸
        vector<Rect> faces;
        faceCascade.detectMultiScale(gray, faces, 1.1, 2, CASCADE_SCALE_IMAGE, Size(90, 90));

        //找出最大的人脸
        Rect faceRect;
        int maxArea = 0;
        for(auto &r:faces) {
            int area = r.width * r.height;
            if (area > maxArea) {
                maxArea = area;
                faceRect = r;
            }
        }

        // 检测眼睛
        Mat faceROI = gray(faceRect);
        vector<Rect> eyes;
        eyeCascade.detectMultiScale(faceROI, eyes, 1.1, 22, CASCADE_SCALE_IMAGE, Size(15, 15));//CASCADE_SCALE_IMAGE

        // 画出人脸和眼睛的矩形框
        for (size_t i = 0; i < eyes.size(); i++) {
            Point center(faceRect.x + eyes[i].x + eyes[i].width / 2, faceRect.y + eyes[i].y + eyes[i].height / 2);
            int radius = cvRound((eyes[i].width + eyes[i].height) * 0.25);
            circle(frame, center, radius, Scalar(0, 0, 255), 2);
        }


    imshow("Frame", frame);
    if (waitKey(1) == 27) // 按ESC键退
    {
        break;
    }
     }
}

3.检测函数详解

eyeCascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30))是OpenCV中用来检测人脸上眼睛位置的函数。

参数含义如下:

faceROI: 检测的图像,需要是灰度图
eyes: 检测到的眼睛的位置,返回为一个vector
1.1: 缩放因子,用于控制级联分类器在图像上进行搜索时的缩放级别,值越大,检测出的结果就越粗略,但检测速度会更快;值越小,检测出的结果就越精确,但检测速度会更慢。
2: 参数设置检测到的目标需要被多少个检测器识别,值越高,检测的阈值越高,反之越低。haarcascade_eye_tree_eyeglasses.xml文件中包含了25个分类器。
0 | CASCADE_SCALE_IMAGE: 检测方式,0表示普通检测,CASCADE_SCALE_IMAGE表示按比例检测
Size(30, 30): 眼睛最小尺寸
该函数会在faceROI中检测眼睛,并将检测到的眼睛位置保存到eyes中。

4.检测效果图

该模型的缺点是,当闭眼时,眼部区域检出率弱。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要使用lbpcascade_frontalface.xml和haarcascade_eye_tree_eyeglasses.xml进行人眼检测,可以使用OpenCV库中的CascadeClassifier类。首先,需要加载这两个XML文件,然后使用CascadeClassifier类的detectMultiScale()函数进行人脸和眼睛检测。在检测到的人脸区域中再使用CascadeClassifier类的detectMultiScale()函数进行眼睛检测。代码示例如下: ``` #include <opencv2/objdetect.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace cv; int main() { CascadeClassifier face_cascade, eye_cascade; face_cascade.load("lbpcascade_frontalface.xml"); eye_cascade.load("haarcascade_eye_tree_eyeglasses.xml"); Mat frame = imread("image.jpg"); Mat gray; cvtColor(frame, gray, COLOR_BGR2GRAY); std::vector<Rect> faces; face_cascade.detectMultiScale(gray, faces); for (size_t i = 0; i < faces.size(); i++) { Mat faceROI = gray(faces[i]); std::vector<Rect> eyes; eye_cascade.detectMultiScale(faceROI, eyes); for (size_t j = 0; j < eyes.size(); j++) { Point center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); circle(frame, center, radius, Scalar(255, 0, 0), 2); } } imshow("result", frame); waitKey(); return 0; } ``` 请注意,这只是一个示例程序,实际应用中可能需要根据具体情况进行修改。 ### 回答2: 使用lbpcascade_frontalface.xml与 haarcascade_eye_tree_eyeglasses.xml进行人眼检测的C程序可以通过以下步骤实现: 1. 首先,导入相关的C库,包括OpenCV库。 2. 加载lbpcascade_frontalface.xml和haarcascade_eye_tree_eyeglasses.xml文件。 3. 读取需要进行人眼检测的图像或视频。 4. 对图像进行灰度转换,将图像转换为灰度图像。 5. 使用加载的lbpcascade_frontalface.xml进行人脸检测。可以使用OpenCV提供的cvHaarDetectObjects()函数,该函数会返回检测到的人脸的矩形框位置。 6. 在每个检测到的人脸矩形框内,使用加载的haarcascade_eye_tree_eyeglasses.xml进行人眼检测。同样可以使用cvHaarDetectObjects()函数,该函数会返回检测到的人眼的矩形框位置。 7. 在图像上绘制出检测到的人脸和人眼的矩形框,可以使用OpenCV提供的cvRectangle()函数。 8. 显示处理后的图像或视频。 以上步骤可以完成lbpcascade_frontalface.xml与 haarcascade_eye_tree_eyeglasses.xml配合使用,实现人眼检测的C程序。根据具体的需求,还可以对检测到的人脸和人眼进行额外的处理,例如计算眼睛的坐标并测量瞳孔距离等。 ### 回答3: lbpcascade_frontalface.xml和haarcascade_eye_tree_eyeglasses.xml是OpenCV中的两个预训练模型文件,它们可以配合使用进行人眼检测的C程序编写。 首先,你需要在C程序中导入所需的头文件和库文件,确保正确使用OpenCV库。 接下来,加载lbpcascade_frontalface.xml模型文件,用于人脸检测。通过使用cvCascadeClassifier函数并传入lbpcascade_frontalface.xml的路径,你可以创建一个人脸检测器对象,例如: ```c CvHaarClassifierCascade* faceCascade; faceCascade = (CvHaarClassifierCascade*)cvLoad("lbpcascade_frontalface.xml", 0, 0, 0); ``` 然后,加载haarcascade_eye_tree_eyeglasses.xml模型文件,用于眼睛检测。创建一个眼睛检测器对象,例如: ```c CvHaarClassifierCascade* eyesCascade; eyesCascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_eye_tree_eyeglasses.xml", 0, 0, 0); ``` 接下来,将所需的图片加载到CvMat对象中: ```c IplImage* img; img = cvLoadImage("your_image.jpg", CV_LOAD_IMAGE_ANYCOLOR); CvMat* gray = cvCreateMat(img->height, img->width, CV_8UC1); cvCvtColor(img, gray, CV_BGR2GRAY); ``` 通过在图像上执行级联分类器检测,你可以检测人脸和眼睛。以下是一个示例代码,用于检测人脸和眼睛: ```c CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* faces = cvHaarDetectObjects(gray, faceCascade, storage, 1.1, 2, CV_HAAR_SCALE_IMAGE, cvSize(30, 30)); for (int i = 0; i < (faces ? faces->total : 0); i++) { CvRect* r = (CvRect*)cvGetSeqElem(faces, i); CvPoint center; int radius; center.x = cvRound((r->x + r->width * 0.5)); center.y = cvRound((r->y + r->height * 0.5)); radius = cvRound((r->width + r->height) * 0.25); cvCircle(img, center, radius, CV_RGB(0, 255, 0), 3, 8, 0); // 在脸部画一个圆圈 cvSetImageROI(gray, *r); CvSeq* eyes = cvHaarDetectObjects(gray, eyesCascade, storage, 1.1, 2, CV_HAAR_SCALE_IMAGE, cvSize(30, 30)); for (int j = 0; j < (eyes ? eyes->total : 0); j++) { CvRect* er = (CvRect*)cvGetSeqElem(eyes, j); CvPoint eye_center; int eye_radius; eye_center.x = cvRound((r->x + er->x + er->width * 0.5)); eye_center.y = cvRound((r->y + er->y + er->height * 0.5)); eye_radius = cvRound((er->width + er->height) * 0.25); cvCircle(img, eye_center, eye_radius, CV_RGB(255, 0, 0), 3, 8, 0); // 在眼睛上画一个圆圈 } cvResetImageROI(img); } cvNamedWindow("Face Detection", 1); cvShowImage("Face Detection", img); cvWaitKey(0); cvDestroyWindow("Face Detection"); ``` 最后,释放所使用的内存空间: ```c cvReleaseImage(&img); cvReleaseMat(&gray); cvReleaseMemStorage(&storage); cvReleaseHaarClassifierCascade(&faceCascade); cvReleaseHaarClassifierCascade(&eyesCascade); ``` 这是一个用于人眼检测的基本C程序使用lbpcascade_frontalface.xml和haarcascade_eye_tree_eyeglasses.xml模型文件。当你在C程序中运行此代码,并提供一个图片,它将检测出人脸和眼睛,并在图片上进行可视化标记。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颢师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值