人脸检测
c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
// 定义用于存储图像的Mat对象
Mat frame, image;
// 定义用于存储单个人脸矩形框的Rect对象
Rect faceRect;
// 定义用于存储所有检测到的人脸矩形框的vector对象
vector<cv::Rect> faceRects;
// 读取图片文件
frame = imread("D:/black.jpg");
// 检查图片是否成功读取
if (frame.empty())
{
cout << "Could not open or find the image!" << endl;
return -1;
}
// 将彩色图像转换为灰度图像
cvtColor(frame, image, cv::COLOR_BGR2GRAY);
// 对灰度图像进行直方图均衡化处理
equalizeHist(image, image);
使用`equalizeHist`函数对灰度图像`image`进行直方图均衡化处理。
- 直方图均衡化可以增强图像的对比度,使得图像的亮度分布更加均匀。
// 定义CascadeClassifier对象,用于加载和使用Haar级联分类器
CascadeClassifier face_Cascade;
// 加载Haar级联分类器XML文件
if (!face_Cascade.load("./haarcascade_frontalface_alt.xml"))
{
cout << "Error loading cascade xml" << endl;
return -1;
}
// 使用级联分类器在灰度图像中检测人脸
face_Cascade.detectMultiScale(image, faceRects, 1.05, 2, cv::CASCADE_SCALE_IMAGE, cv::Size(image.cols / 10, image.rows / 10));
// 遍历所有检测到的人脸矩形框,并在原图像上绘制矩形
for (int i = 0; i < faceRects.size(); i++) {
faceRect = faceRects[i];
cv::rectangle(frame, faceRect, cv::Scalar(255, 255, 0), 2);
}
// 显示处理后的图像
cv::imshow("detection", frame);
// 等待用户按键
cv::waitKey(0);
// 返回0,表示程序成功结束
return 0;
}
- 使用`detectMultiScale`函数在灰度图像`image`中检测人脸。
- `faceRects`用于存储检测到的所有人脸矩形框。
- `1.05`是缩放因子(scaleFactor),表示在每次扫描时图像的缩放比例。
- `2`是最小邻域数(minNeighbors),表示每个候选矩形框需要保留的最小邻域数。
- `cv::CASCADE_SCALE_IMAGE`表示使用图像缩放的方式进行检测。
- `cv::Size(image.cols / 10, image.rows / 10)`是最小检测区域大小(minSize),表示检测到的目标的最小尺寸。
1. **`image`**:
- 类型: `const Mat&`
- 作用: 输入的灰度图像,通常是对原始图像进行灰度转换和直方图均衡化后的图像。
- 示例: `image` 是经过 `cvtColor` 和 `equalizeHist` 处理后的灰度图像。
2. **`faceRects`**:
- 类型: `vector<Rect>&`
- 作用: 输出参数,用于存储检测到的所有目标(如人脸)的矩形框。
- 示例: `faceRects` 是一个 `vector<Rect>` 对象,检测到的人脸区域会存储在这个向量中。
3. **`1.05` (scaleFactor)**:
- 类型: `double`
- 作用: 缩放因子,表示在每次图像扫描时图像的缩放比例。
- 示例: `1.05` 表示每次扫描时图像的大小增加 5%。
- 说明: 较大的缩放因子会加快检测速度,但可能会漏检较小的目标。
4. **`2` (minNeighbors)**:
- 类型: `int`
- 作用: 最小邻域数,表示每个候选矩形框需要保留的最小邻域数。
- 示例: `2` 表示每个候选矩形框必须至少有 2 个邻居矩形框才能被保留。
- 说明: 较大的最小邻域数会减少误检,但可能会漏检一些目标。
5. **`cv::CASCADE_SCALE_IMAGE` (flags)**:
- 类型: `int`
- 作用: 标志位,用于指定检测过程中的某些选项。
- 示例: `cv::CASCADE_SCALE_IMAGE` 表示图像大小在检测过程中会改变,而不是检测窗口的大小。
- 说明: 这个标志位可以帮助提高检测的准确性。
6. **`cv::Size(image.cols / 10, image.rows / 10)` (minSize)**:
- 类型: `const Size&`
- 作用: 检测到的目标的最小尺寸。
- 示例: `cv::Size(image.cols / 10, image.rows / 10)` 表示检测到的人脸最小尺寸为图像宽度和高度的 1/10。
- 说明: 较小的最小尺寸可能会检测到更多的目标,但可能会增加误检的可能性
视频人脸识别
c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
int main() {
cv::VideoCapture video("D:/leijun.mp4");
if (!video.isOpened())
{
cerr << "无法打开视频文件或摄像头" << endl;
return -1;
}
cv::CascadeClassifier face_Cascade;
if (!face_Cascade.load("./haarcascade_frontalface_alt.xml"))
{
cerr << "加载人脸分类器失败" << endl;
return -1;
}
cv::namedWindow("Face Detection System");
while (true)
{
cv::Mat frame;
video >> frame;
if (frame.empty())
{
break;
}
// 缩放视频帧,设置目标大小
cv::Size newSize(frame.cols /5, frame.rows /5); // 将帧缩小到原来的50%
cv::Mat resizedFrame;
cv::resize(frame, resizedFrame, newSize, 0, 0, cv::INTER_LINEAR); // 使用线性插值法进行缩放
cv::Mat gray_image;
cv::cvtColor(resizedFrame, gray_image, cv::COLOR_BGR2GRAY);
cv::equalizeHist(gray_image, gray_image);
vector<cv::Rect> faceRects;
int minSize_1 = min(resizedFrame.cols, resizedFrame.rows) / 10;
face_Cascade.detectMultiScale(gray_image, faceRects, 1.28, 2, 0, cv::Size(minSize_1, minSize_1));
for (int i = 0; i < faceRects.size(); i++)
{
cv::Rect faceRect = faceRects[i];
cv::rectangle(resizedFrame, faceRect, cv::Scalar(0, 255, 0), 2);
}
cv::imshow("Face Detection System", resizedFrame);
char key = (char)cv::waitKey(5);
if (key == 27)
{ // 按下ESC键退出
break;
}
}
video.release();
cv::destroyWindow("Face Detection System");
return 0;
}