使用opencv和dlib库从摄像头中取人脸进行人眼检测的c++程序
时间: 2024-01-08 15:03:47 浏览: 100
好的,以下是使用OpenCV和Dlib库从摄像头中取人脸进行人眼检测的C++程序示例:
```
#include <iostream>
#include <opencv2/opencv.hpp>
#include <dlib/opencv.h>
#include <dlib/image_processing.h>
#include <dlib/image_processing/frontal_face_detector.h>
using namespace std;
using namespace cv;
using namespace dlib;
int main()
{
// 初始化人脸检测器
frontal_face_detector detector = get_frontal_face_detector();
// 初始化眼睛检测器
shape_predictor predictor;
deserialize("shape_predictor_68_face_landmarks.dat") >> predictor;
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "无法打开摄像头" << endl;
return -1;
}
// 循环读取摄像头的每一帧并进行人脸和眼睛检测
while (true)
{
Mat frame;
cap >> frame;
if (frame.empty())
break;
// 转为灰度图
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
// 用人脸检测器检测人脸
std::vector<rectangle> faces = detector(gray);
for (size_t i = 0; i < faces.size(); ++i)
{
// 用眼睛检测器检测眼睛
full_object_detection shape = predictor(gray, faces[i]);
for (unsigned long j = 36; j <= 41; ++j)
{
line(frame, shape.part(j), shape.part(j + 1), Scalar(0, 255, 0), 1);
}
line(frame, shape.part(41), shape.part(36), Scalar(0, 255, 0), 1);
for (unsigned long j = 42; j <= 47; ++j)
{
line(frame, shape.part(j), shape.part(j + 1), Scalar(0, 255, 0), 1);
}
line(frame, shape.part(47), shape.part(42), Scalar(0, 255, 0), 1);
}
// 显示结果
imshow("人脸和眼睛检测", frame);
// 按q键退出
if (waitKey(1) == 'q')
break;
}
return 0;
}
```
在上面的代码中,我们首先初始化了一个人脸检测器和一个眼睛检测器。然后,我们打开摄像头并循环读取每一帧图像。对于每一帧图像,我们首先将其转换为灰度图像,并使用人脸检测器检测人脸。对于每个检测到的人脸,我们使用眼睛检测器检测眼睛,并在图像上绘制出检测到的眼睛的位置。最后,我们显示处理后的图像,并在用户按下“q”键时退出程序。
需要注意的是,这个程序依赖于Dlib库中的一个预训练模型文件“shape_predictor_68_face_landmarks.dat”,所以需要将该文件放在程序可执行文件的同一目录下才能正常运行。
阅读全文