请使用OpenCV库写一份C++的疲劳驾驶识别代码
时间: 2023-12-12 11:05:11 浏览: 107
基于OpenCV的疲劳驾驶预警系统设计与实现
5星 · 资源好评率100%
好的,以下是一份基于OpenCV库的疲劳驾驶识别代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0); //打开摄像头
if (!cap.isOpened()) //检查摄像头是否成功打开
{
cout << "无法打开摄像头" << endl;
return -1;
}
Mat frame;
CascadeClassifier faceCascade; //分类器
faceCascade.load("haarcascade_frontalface_alt.xml"); //加载分类器
while (true) //循环处理每一帧图像
{
cap >> frame; //读取一帧图像
if (frame.empty()) //检查图像是否读取成功
{
cout << "图像读取失败" << endl;
break;
}
Mat grayFrame;
cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //将图像转为灰度图像
vector<Rect> faces;
faceCascade.detectMultiScale(grayFrame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); //检测人脸
for (size_t i = 0; i < faces.size(); i++) //遍历每个人脸
{
Rect face = faces[i];
Point center(face.x + face.width / 2, face.y + face.height / 2);
ellipse(frame, center, Size(face.width / 2, face.height / 2), 0, 0, 360, Scalar(0, 255, 0), 2); //绘制椭圆
Mat roi = grayFrame(face); //获取人脸区域
double eyeAspectRatio = 0.0;
//计算眼睛长宽比
vector<Rect> eyes;
CascadeClassifier eyeCascade;
eyeCascade.load("haarcascade_eye.xml"); //加载分类器
eyeCascade.detectMultiScale(roi, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); //检测眼睛
if (eyes.size() == 2) //如果检测到两只眼睛
{
Point leftEyeCenter(eyes[0].x + eyes[0].width / 2, eyes[0].y + eyes[0].height / 2);
Point rightEyeCenter(eyes[1].x + eyes[1].width / 2, eyes[1].y + eyes[1].height / 2);
//计算眼睛长宽比
double eyeWidth = abs(rightEyeCenter.x - leftEyeCenter.x);
double leftEyeHeight = abs(eyes[0].y - eyes[0].height / 2 - eyes[0].y + eyes[0].height);
double rightEyeHeight = abs(eyes[1].y - eyes[1].height / 2 - eyes[1].y + eyes[1].height);
eyeAspectRatio = (leftEyeHeight + rightEyeHeight) / (2.0 * eyeWidth);
}
//判断疲劳驾驶
if (eyeAspectRatio < 0.25)
{
putText(frame, "疲劳驾驶", Point(10, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2);
}
else
{
putText(frame, "未疲劳驾驶", Point(10, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2);
}
}
imshow("疲劳驾驶识别", frame); //显示图像
if (waitKey(30) == 27) //等待按键,如果按下ESC键则退出循环
{
break;
}
}
cap.release(); //释放摄像头
destroyAllWindows(); //关闭所有窗口
return 0;
}
```
这份代码通过检测人脸和眼睛来判断是否疲劳驾驶,需要使用到OpenCV中的Haar级联分类器。代码中使用了两个分类器,一个用于检测人脸,另一个用于检测眼睛。如果检测到两只眼睛,就计算出眼睛长宽比,根据长宽比判断是否疲劳驾驶。如果长宽比小于0.25,则判断为疲劳驾驶。最后将结果显示在图像上。
阅读全文