一:VS创建解决方案
二:配置项目环境,在另外一篇文章中有提及到:VS2022与OpenCV4.5.5的配置-CSDN博客
三:解析代码
1.获取摄像头数据显示在“读取视频”的界面上,其中 VideoCapture capture(0); 中的参数0代表默认摄像头。
//使用opencv打开默认摄像头
VideoCapture capture(0);
while (true) {
Mat frame;
capture >> frame;
imshow("读取视频", frame);
waitKey(30);
}
2.加载Haar级联人脸检测器
// 加载Haar级联人脸检测器
cv::CascadeClassifier face_cascade;
face_cascade.load("D:/opencv/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml");
3. 转化为灰度图像进行识别,然后将坐标存放在容器中用于绘制
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
// 检测人脸存放坐标
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(
gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30)
);
4.绘制显示识别结果(灰度图像识别,原始图像绘制)
// 为每个人脸画框
for (size_t i = 0; i < faces.size(); i++) {
cv::rectangle(frame, faces[i], cv::Scalar(255, 0, 0), 2);
}
// 显示结果
cv::imshow("Face Detection", frame);
5.释放摄像头资源
// 释放摄像头资源
capture.release();
cv::destroyAllWindows();
四:总代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
using namespace std;
using namespace cv;
int main()
{
//使用opencv打开默认摄像头
VideoCapture capture(0);
// 加载Haar级联人脸检测器
cv::CascadeClassifier face_cascade;
face_cascade.load("D:/opencv/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml");
cv::Mat frame;
while (true) {
capture >> frame; // 从摄像头读取一帧
if (frame.empty()) {
break; // 如果帧为空,则退出循环
}
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
// 检测人脸存放坐标
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(
gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30)
);
// 为每个人脸画框
for (size_t i = 0; i < faces.size(); i++) {
cv::rectangle(frame, faces[i], cv::Scalar(255, 0, 0), 2);
}
// 显示结果
cv::imshow("Face Detection", frame);
// 按'q'退出循环
if (cv::waitKey(10) == 'q') {
break;
}
}
// 释放摄像头资源
capture.release();
cv::destroyAllWindows();
return 0;
}
在总代码中有些头文件不是必须包含的,根据自己情况需求而定 。