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官方文件位置

相关推荐
Byron Loong39 分钟前
Python+OpenCV系列:AI看图识人、识车、识万物
人工智能·python·opencv
hunandede1 小时前
使用ZLMediaKit 开源项目搭建RTSP 服务器
c++
因特麦克斯2 小时前
如何处理对象的状态变化?如何实现工厂模式?
开发语言·c++
14_113 小时前
Cherno C++学习笔记 P43 对象生存周期
c++·笔记·学习
E___V___E3 小时前
opencv 项目--图像匹配
人工智能·opencv·计算机视觉
Tiandaren4 小时前
从Python到C++的转变之路——如何高效复现C++开源项目 || Windows || Visual Studio || 持续更新
开发语言·c++·图像处理·人工智能·python·深度学习·开源
乌漆嘎嘎黑5 小时前
Hu矩原理 | cv2中基于Hu矩计算图像轮廓相似度差异的函数cv2.matchShapes【小白记笔记】
人工智能·opencv·计算机视觉·hu矩·轮廓相似度
落叶慢慢7 小时前
新校区布网
c++