opencv 读取本机摄像头画面并实现人脸框的检测

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiyaozhe/article/details/81083496

先放代码,在一一解释

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    VideoCapture capture(0);   //调用本地摄像头

    String cascadeFilePath = "E:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";  //opencv训练好的分类模型

    CascadeClassifier face_cascade;  //实例化分类器

    if (!face_cascade.load(cascadeFilePath))         // 用load函数加载XML分类器文件
    {
        printf("could not load the haar data...\n");
        return -1;
    }

    Mat src_img, gray_img;

    while (true)
    {
        //src_img = imread("E:/123.jpg");   //图片测试
        //imshow("原图", src_img);

        capture >> src_img;
        cvtColor(src_img, gray_img, COLOR_BGR2GRAY); //将原图转化为灰度图
        equalizeHist(gray_img, gray_img);        //直方图均衡化

        vector<Rect> faces;                  // faces是一个容器,用来接收检测到的人脸

        face_cascade.detectMultiScale(gray_img, faces, 1.1, 3, 0);  //用分类器寻找人脸

        for (auto t = 0; t < faces.size(); ++t)
        {
            rectangle(src_img, faces[t], Scalar(0, 0, 255), 2, 8, 0);            // 用红色矩形框出人脸
        }

        imshow("results", src_img);

        waitKey(10);    //延时10
    }
    return 0;
}

一、 VideoCapture 类读取视频或调用本地摄像头

  1. 读取视屏

VideoCapture capture(“1.avi”);

  1. 调用摄像头
    VideoCapture capture(0);

显示视频或摄像头:
视频或摄像头内容读取到VideoCapture类对象之后,用一个循环将每一帧显示出来

while(1)
{
    Mat frame;
    capture>>frame;
    imshow("results",frame);
    waitkey(10);
}

二、分类模型

opencv 已经内置了训练好的模型,放置在 etc 文件夹下。分别是用haar特征和lbp特征训练的分类模型,两种特征具体信息可以百度。

三、detectMultiScale(InputArray image, CV_OUT std::vector& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() )

其参数解释如下:

  • image:待检测图片,一般为灰度图像以加快检测速度;
  • objects:vector类型,为输出量,表示被检测物体的矩形框向量组;
  • scaleFactor:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;一般设置为1.1
  • minNeighbor:表示构成检测目标的相邻矩形的最小个数( 默认值为3)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
  • flags:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;
  • minSize和maxSize:用来限制得到的目标区域的范围。

detectMultiscale函数为多尺度多目标检测,多尺度:通常搜索目标的模板尺寸大小是固定的,但是不同图片大小不同,所以目标对象的大小也是不定的,所以多尺度即不断缩放图片大小(缩放到与模板匹配),通过模板滑动窗函数搜索匹配;同一副图片可能在不同尺度下都得到匹配值,所以多尺度检测函数detectMultiscale是多尺度合并的结果。 多目标:通过检测符合模板匹配对象,可得到多个目标,均输出到objects向量里面。

猜你喜欢

转载自blog.csdn.net/xiyaozhe/article/details/81083496