opencv(c++)人脸检测

人脸检测

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;
}

haarcascade_frontalface_alt.xml在opencv官方文件位置

相关推荐
小禾苗_1 小时前
C++ ——继承
开发语言·c++
OrangeJiuce2 小时前
【QT中的一些高级数据结构,持续更新中...】
数据结构·c++·qt
程序员-King.4 小时前
【接口封装】——13、登录窗口的标题栏内容设置
c++·qt
萌の鱼5 小时前
leetcode 2826. 将三个组排序
数据结构·c++·算法·leetcode
RAN_PAND5 小时前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
mit6.8248 小时前
[实现Rpc] 通信-Muduo库的实现 | && 完美转发 | reserve | unique_lock
c++·网络协议·rpc
JANGHIGH9 小时前
c++ std::list使用笔记
c++·笔记·list
画个逗号给明天"9 小时前
C++STL容器之list
开发语言·c++
Fansv58710 小时前
深度学习-6.用于计算机视觉的深度学习
人工智能·深度学习·计算机视觉