int main() { String filename = "D:\\code\\opencv-4.5.0-vc14_vc15\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml"; String filename_eye = "D:\\code\\opencv-4.5.0-vc14_vc15\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml"; CascadeClassifier face_classifiler; CascadeClassifier eye_detect; if (!face_classifiler.load(filename)) { printf("The CascadeClassifier load fail!"); return 0; } if (!eye_detect.load(filename_eye)) { printf("The CascadeClassifier load fail!"); return 0; } namedWindow("face", WINDOW_AUTOSIZE); VideoCapture capture(1); Mat frame; Mat gray; while (capture.read(frame)) { cvtColor(frame, gray, COLOR_BGR2GRAY); equalizeHist(gray, gray); vector<Rect>faces; vector<Rect>eyes; face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30)); for (size_t t = 0; t < faces.size(); t++) { rectangle(frame, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0); cv::Point locate; locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4); locate.y = (float)(faces[static_cast<int>(t)].y - 10); putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX,1.2, (0, 0, 255), 2, 8); Mat eyeLocate = frame(faces[static_cast<int>(t)]); eye_detect.detectMultiScale(eyeLocate, eyes, 1.2, 10, 0, Size(20, 20)); for (size_t s = 0; s < eyes.size(); s++) { Rect rect; rect.x = faces[static_cast<int>(t)].x + eyes[s].x; rect.y = faces[static_cast<int>(t)].y + eyes[s].y; rect.width = eyes[s].width; rect.height = eyes[s].height; rectangle(frame, rect, Scalar(0, 255, 0), 2, 8, 0); } } imshow("face", frame); if (waitKey(10) == 27) { break; } } capture.release(); destroyAllWindows(); return 0; }
时间: 2024-04-19 21:27:03 浏览: 157
这段代码是一个简单的人脸和眼睛检测程序,使用了OpenCV库。让我解释一下代码的逻辑和功能:
1. 首先,加载了人脸和眼睛级联分类器的路径,并创建了`CascadeClassifier`对象`face_classifiler`和`eye_detect`来加载这些分类器。
2. 窗口初始化:创建一个名为"face"的窗口,用于显示检测到的人脸和眼睛。
3. 打开视频捕获设备:通过`VideoCapture`对象`capture`打开摄像头设备(摄像头索引为1)。
4. 进入主循环:通过`capture.read(frame)`读取摄像头捕获的帧,并将其存储在`frame`中。
5. 图像处理:将每一帧转换为灰度图像,然后进行直方图均衡化以增强图像对比度。
6. 人脸检测:使用`face_classifiler.detectMultiScale()`函数检测图像中的人脸,并将检测结果存储在`faces`向量中。
7. 人脸标记:遍历所有检测到的人脸,使用矩形框标记出每个人脸,并在人脸上方显示 "Person" 的文本。
8. 眼睛检测:在每个人脸区域内,使用`eye_detect.detectMultiScale()`函数检测眼睛,并将结果存储在`eyes`向量中。
9. 眼睛标记:遍历所有检测到的眼睛,使用矩形框标记出每个眼睛。
10. 显示结果:使用`imshow()`函数显示带有标记的人脸和眼睛的图像。
11. 检测退出:如果按下键盘上的 ESC 键(键码为27),则退出循环。
12. 释放资源:释放视频捕获设备和销毁窗口。
这段代码可以实现实时的人脸和眼睛检测。如果你有任何关于这段代码的问题,可以继续提问哦!
阅读全文