Qt+OpenCV联合开发(二十九)--实时人脸检测案例

一、准备工作

1、下载人脸检测用到的库文件,包括Tensorflow模型以及配置文件,如图,库文件可以放在任意位置

2、加入头文件

二、函数原型

1、readNetFromTensorflow函数

作用:读取Tensorflow模型以及配置文件

c++原型:

参数:

  1. model: Tensorflow模型文件(.pb文件)
  2. config: Tensorflow配置文件(.pbtxt文件)

返回值:读到的dnn::Net类型的网络文件

2、blobFromImage函数

作用:主要是用来对图片进行预处理

c++原型:

参数:

  1. image: 输入图像
  2. scalefactor:当我们将图片减去平均值之后,还可以对剩下的像素值进行一定的尺度缩放,默认值是1.0。如果希望减去平均像素之后的值,全部缩小一半,那么可以将scalefactor设为0.5。
  3. size:是我们神经网络在训练的时候要求输入的图片尺寸
  4. mean:需要将图片整体减去的平均值,如果我们需要对RGB图片的三个通道分别减去不同的值,那么可以使用3组平均值,如果只使用一组,那么就默认对三个通道减去一样的值。
  5. swapRB:是否要进行RB两个通道的交换,默认false。OpenCV中认为我们的图片通道顺序是BGR,但是我平均值假设的顺序是RGB,所以如果需要交换R和G,那么就为true
  6. crop:是否要进行剪切,默认false

补充参数mean:

减去平均值为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,这样就可以得到像素之间的相对值,就可以排除光照的影响。

 三、实现思路及效果

1、思路

  1. 读取Tensorflow模型以及配置文件
  2. 加载并读取视频
  3. 对图片进行预处理
  4. 把预处理完的数据(NCHW)input到Tensorflow网络模型中去推理
  5. 获取推理后的数据并重新构建Mat图像
  6. 解析结果(绘制矩形)
  7. 显示图像

2、效果

2.1读取摄像头:实时人脸检测

 

 2.2读取视频,打开以下视频查看(已上传至优酷)

四、代码

void test1::detect_face()
{
    String root_dir = "E:/qt-zqw/qt-workplace/opencvDemo1/face_detector/";
    //读取Tensorflow模型以及配置文件
    dnn::Net net = dnn::readNetFromTensorflow(root_dir+"opencv_face_detector_uint8.pb",root_dir+"opencv_face_detector.pbtxt");//读取深度学习Tensorflow模型
    VideoCapture capture("E:/images/images/example_dsh.mp4");//加载视频
    Mat frame;
    while (true) {
        capture.read(frame);
        if(frame.empty())
        {
            break;
        }
        //读模型
        Mat blob = dnn::blobFromImage(frame,1.0,Size(300,300),Scalar(104,177,123),false,false);
        net.setInput(blob);//blob就是 NCHW  多少个 通道数 高度 宽度
        //获取数据
        Mat probs = net.forward();//获取推理后的数据
        Mat detectionMat(probs.size[2],probs.size[3],CV_32F,probs.ptr<float>());//构建Mat图像
        //解析结果
        for(int i=0;i<detectionMat.rows;i++)
        {
            float con = detectionMat.at<float>(i,2);
            if(con>0.5)//大于0.5就是人脸
            {
                //获取矩形坐标(第3,4,5,6参数)
                int x1 = static_cast<int>(detectionMat.at<float>(i,3)*frame.cols);
                int y1 = static_cast<int>(detectionMat.at<float>(i,4)*frame.rows);
                int x2 = static_cast<int>(detectionMat.at<float>(i,5)*frame.cols);
                int y2 = static_cast<int>(detectionMat.at<float>(i,6)*frame.rows);
                Rect box(x1,y1,x2-x1,y2-y1);
                rectangle(frame,box,Scalar(0,0,255),2,8,0);
            }
        }
        imshow("detect_face",frame);
        int c = waitKey(1);
        if(c ==27)
        {
            break;

        }
    }
}

 VideoCapture capture("E:/images/images/example_dsh.mp4");把参数换成0即为读取摄像头

 原创不易,转载请注明出处:

Qt+OpenCV联合开发(二十九)--实时人脸检测案例

猜你喜欢

转载自blog.csdn.net/hml111666/article/details/122840764