疲劳驾驶检测opencv cpp代码
时间: 2023-07-04 20:12:26 浏览: 66
以下是一个基于 OpenCV 的疲劳驾驶检测的参考代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 1. 采集视频帧
VideoCapture cap;
cap.open(0);
if (!cap.isOpened())
{
cout << "Cannot open the video cam" << endl;
return -1;
}
// 2. 人脸检测
CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_alt.xml");
if (face_cascade.empty())
{
cout << "Cannot load face cascade" << endl;
return -1;
}
// 3. 眼睛检测
CascadeClassifier eye_cascade;
eye_cascade.load("haarcascade_eye.xml");
if (eye_cascade.empty())
{
cout << "Cannot load eye cascade" << endl;
return -1;
}
// 4. 眼睛状态检测
bool isBlinked = false;
int blinkFrames = 0;
int openFrames = 0;
const int blinkThreshold = 5;
const int openThreshold = 10;
// 5. 驾驶状态判断
bool isFatigued = false;
const int fatigueThreshold = 5;
// 6. 播放警报
bool isAlarm = false;
while (true)
{
Mat frame;
cap >> frame;
// 人脸检测
std::vector<Rect> faces;
face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
if (faces.empty())
{
isBlinked = false;
blinkFrames = 0;
openFrames = 0;
continue;
}
// 眼睛检测
Rect faceRect = faces[0];
Mat faceROI = frame(faceRect);
std::vector<Rect> eyes;
eye_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
if (eyes.size() < 2)
{
isBlinked = false;
blinkFrames = 0;
openFrames = 0;
continue;
}
// 眼睛状态检测
isBlinked = false;
for (size_t i = 0; i < eyes.size(); i++)
{
Rect eyeRect = eyes[i];
int eyeX = eyeRect.x + faceRect.x;
int eyeY = eyeRect.y + faceRect.y;
int eyeWidth = eyeRect.width;
int eyeHeight = eyeRect.height;
Mat eyeROI = frame(Rect(eyeX, eyeY, eyeWidth, eyeHeight));
double threshold = threshold_otsu(eyeROI);
if (threshold > 80)
{
isBlinked = true;
blinkFrames++;
openFrames = 0;
}
else
{
openFrames++;
blinkFrames = 0;
}
}
// 驾驶状态判断
if (isBlinked)
{
if (blinkFrames >= blinkThreshold)
{
isFatigued = true;
blinkFrames = 0;
}
}
else
{
if (openFrames >= openThreshold)
{
isFatigued = false;
openFrames = 0;
}
}
if (isFatigued)
{
isAlarm = true;
// 播放警报
}
else
{
isAlarm = false;
}
// 绘制结果
rectangle(frame, faceRect, Scalar(0, 255, 0), 2);
for (size_t i = 0; i < eyes.size(); i++)
{
Rect eyeRect = eyes[i];
int eyeX = eyeRect.x + faceRect.x;
int eyeY = eyeRect.y + faceRect.y;
rectangle(frame, Rect(eyeX, eyeY, eyeRect.width, eyeRect.height), Scalar(0, 0, 255), 2);
}
if (isAlarm)
{
putText(frame, "ALARM", Point(50, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2);
}
imshow("frame", frame);
if (waitKey(30) == 27)
{
break;
}
}
return 0;
}
```
这段代码实现了基本的疲劳驾驶检测功能,但还有很多细节需要优化和完善,例如调整阈值、优化人脸检测和眼睛检测的性能、增加更多的指标来判断驾驶状态等。