OpenCV实现人脸检测功能

本文实例为大家分享了OpenCV实现人脸检测功能的具体代码,供大家参考,具体内容如下

1、HAAR级联检测

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

using namespace cv;

#include <iostream>
#include <cstdlib>
using namespace std;

int main(int artc, char** argv) {
 face_detect_haar();
 waitKey(0);
 return 0;
}

void face_detect_haar() {
 CascadeClassifier faceDetector;
 std::string haar_data_file = "./models/haarcascades/haarcascade_frontalface_alt_tree.xml";
 faceDetector.load(haar_data_file);
 vector<Rect> faces;
 //VideoCapture capture(0);
 VideoCapture capture("./video/test.mp4");
 Mat frame, gray;
 int count=0;
 while (capture.read(frame)) {
 int64 start = getTickCount();
 if (frame.empty())
 {
  break;
 }
 // 水平镜像调整
 // flip(frame, frame, 1);
 imshow("input", frame);
 if (frame.channels() == 4)
  cvtColor(frame, frame, COLOR_BGRA2BGR);
 cvtColor(frame, gray, COLOR_BGR2GRAY);
 equalizeHist(gray, gray);
 faceDetector.detectMultiScale(gray, faces, 1.2, 1, 0, Size(30, 30), Size(400, 400));
 for (size_t t = 0; t < faces.size(); t++) {
  count++;
  rectangle(frame, faces[t], Scalar(0, 255, 0), 2, 8, 0);
 }
 float fps = getTickFrequency() / (getTickCount() - start);
 ostringstream ss;ss.str("");
 ss << "FPS: " << fps << " ; inference time: " << time << " ms";
 putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8);
 imshow("haar_face_detection", frame);
 if (waitKey(1) >= 0) break;
 }

  printf("total face: %d\n", count);
}

2、 DNN人脸检测

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

using namespace cv;
using namespace cv::dnn;

#include <iostream>
#include <cstdlib>
using namespace std;

const size_t inWidth = 300;
const size_t inHeight = 300;
const double inScaleFactor = 1.0;
const Scalar meanVal(104.0, 177.0, 123.0);
const float confidenceThreshold = 0.7;
void face_detect_dnn();
void mtcnn_demo();
int main(int argc, char** argv)
{
  face_detect_dnn();
  waitKey(0);
  return 0;
}

void face_detect_dnn() {
  //这里采用tensorflow模型
  std::string modelBinary = "./models/dnn/face_detector/opencv_face_detector_uint8.pb";
  std::string modelDesc = "./models/dnn/face_detector/opencv_face_detector.pbtxt";
  // 初始化网络
  dnn::Net net = readNetFromTensorflow(modelBinary, modelDesc);

  net.setPreferableBackend(DNN_BACKEND_OPENCV);
  net.setPreferableTarget(DNN_TARGET_CPU);
  if (net.empty())
  {
    printf("Load models fail...\n");
    return;
  }

  // 打开摄像头
  // VideoCapture capture(0);
  VideoCapture capture("./video/test.mp4");
  if (!capture.isOpened()) {
    printf("Don't find video...\n");
    return;
  }

  Mat frame;
  int count=0;
  while (capture.read(frame)) {
    int64 start = getTickCount();
    if (frame.empty())
    {
      break;
    }
    // 水平镜像调整
    // flip(frame, frame, 1);
    imshow("input", frame);
    if (frame.channels() == 4)
      cvtColor(frame, frame, COLOR_BGRA2BGR);

    // 输入数据调整
    Mat inputBlob = blobFromImage(frame, inScaleFactor,
      Size(inWidth, inHeight), meanVal, false, false);
    net.setInput(inputBlob, "data");

    // 人脸检测
    Mat detection = net.forward("detection_out");
    vector<double> layersTimings;
    double freq = getTickFrequency() / 1000;
    double time = net.getPerfProfile(layersTimings) / freq;
    Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());

    ostringstream ss;
    for (int i = 0; i < detectionMat.rows; i++)
    {
      // 置信度 0~1之间
      float confidence = detectionMat.at<float>(i, 2);
      if (confidence > confidenceThreshold)
      {
        count++;
        int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * frame.cols);
        int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * frame.rows);
        int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * frame.cols);
        int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * frame.rows);

        Rect object((int)xLeftBottom, (int)yLeftBottom,
          (int)(xRightTop - xLeftBottom),
          (int)(yRightTop - yLeftBottom));

        rectangle(frame, object, Scalar(0, 255, 0));

        ss << confidence;
        std::string conf(ss.str());
        std::string label = "Face: " + conf;
        int baseLine = 0;
        Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
        rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height),
          Size(labelSize.width, labelSize.height + baseLine)),
          Scalar(255, 255, 255), FILLED);
        putText(frame, label, Point(xLeftBottom, yLeftBottom),
          FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
      }
    }
    float fps = getTickFrequency() / (getTickCount() - start);
    ss.str("");
    ss << "FPS: " << fps << " ; inference time: " << time << " ms";
    putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8);
    imshow("dnn_face_detection", frame);
    if (waitKey(1) >= 0) break;
  }
  printf("total face: %d\n", count);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV实现人脸检测

    前段日子,写了个人脸检测的小程序,可以检测标记图片.视频.摄像头中的人脸.效果还行吧,用的是opencv提供人脸库.至于具体的人脸检测原理,找资料去啃吧. 环境:VS2013+OPENCV2.4.10+Win8.1 一.基于对话框的MFC 首先,新建一个基于对话框的MFC应用程序,命名为myFaceDetect(取消"安全开发周期(SDL)检查"勾选,我自己习惯取消这个). 放置Button,设置Button的ID和Caption. 图片按钮--ID:IDC_FACEDETECT 视频

  • 基于openCV实现人脸检测

    openCV的人脸识别主要通过Haar分类器实现,当然,这是在已有训练数据的基础上.openCV安装在 opencv/opencv/sources/data/haarcascades_cuda(或haarcascades)中存在预先训练好的物体检测器(xml格式),包括正脸.侧脸.眼睛.微笑.上半身.下半身.全身等. openCV的的Haar分类器是一个监督分类器,首先对图像进行直方图均衡化并归一化到同样大小,然后标记里面是否包含要监测的物体.它首先由Paul Viola和Michael Jon

  • opencv实现图片与视频中人脸检测功能

    本文实例为大家分享了opencv实现人脸检测功能的具体代码,供大家参考,具体内容如下 第一章:反思与总结 上一篇博客我相信自己将人脸检测中的AdaBoost算法解释的非常清晰了,以及如何训练人脸检测的强分类器:人脸检测中AdaBoost算法详解.事后,自我感觉对这个人脸检测还是不够具体,所以自己抽了一下午的时间用opencv实现图片与视频中的人脸检测,下面是我用vs2013加opencv4.9来实现的.做一下声明,我的代码是参考OpenCV实现人脸检测的一个博客写的,非常感谢这位博主,我学到了很

  • Python下应用opencv 实现人脸检测功能

    使用OpenCV's Haar cascades作为人脸检测,因为他做好了库,我们只管使用. 代码简单,除去注释,总共有效代码只有10多行. 所谓库就是一个检测人脸的xml 文件,可以网上查找,下面是一个地址: https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml 如何构造这个库,学习完本文后可以参考: http://note.sonots.com/Sc

  • OpenCV实现人脸检测功能

    本文实例为大家分享了OpenCV实现人脸检测功能的具体代码,供大家参考,具体内容如下 1.HAAR级联检测 #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; #include <iostream> #include <cstdlib> using namespace std; int main(int artc, char** argv) { face_detect_h

  • Android 中使用 dlib+opencv 实现动态人脸检测功能

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用矩形框描绘出来.具体实现原理如下: 采用双层 View,底层的 TextureView 用于预览,程序从 TextureView 中获取预览帧数据,然后调用 dlib 库对帧数据进行处理,最后将检测结果绘制在顶层的 SurfaceView 中. 2 项目配置 由于项目中用到了 dlib 与 open

  • 50行Python代码实现人脸检测功能

    现在的人脸识别技术已经得到了非常广泛的应用,支付领域.身份验证.美颜相机里都有它的应用.用iPhone的同学们应该对下面的功能比较熟悉 iPhone的照片中有一个"人物"的功能,能够将照片里的人脸识别出来并分类,背后的原理也是人脸识别技术. 这篇文章主要介绍怎样用Python实现人脸检测.人脸检测是人脸识别的基础.人脸检测的目的是识别出照片里的人脸并定位面部特征点,人脸识别是在人脸检测的基础上进一步告诉你这个人是谁. 好了,介绍就到这里.接下来,开始准备我们的环境. 准备工作 本文的人

  • Python基于OpenCV实现人脸检测并保存

    本文实例为大家分享了Python基于OpenCV实现人脸检测,并保存的具体代码,供大家参考,具体内容如下 安装opencv 如果安装了pip的话,Opencv的在windows的安装可以直接通过cmd命令pip install opencv-python(只需要主要模块),也可以输入命令pip install opencv-contrib-python(如果需要main模块和contrib模块) 详情可以点击此处 导入opencv import cv2 所有包都包含haarcascade文件.这

  • python利用Opencv实现人脸识别功能

    本文实例为大家分享了python利用Opencv实现人脸识别功能的具体代码,供大家参考,具体内容如下 首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(w

  • springboot集成opencv实现人脸识别功能的详细步骤

    前言 项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,由于成本高昂不得不寻求替代方案. 什么是opencv? OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上.轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Java.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. 项目集成步骤 由于项目是放在Linux系统中跑的

  • 手把手教你利用opencv实现人脸识别功能(附源码+文档)

    目录 一.环境 二.使用Haar级联进行人脸检测 三.Haar级联结合摄像头 四.使用SSD的人脸检测 五. SSD结合摄像头人脸检测 六.结语 一.环境 pip install opencv-python python3.9 pycharm2020 人狠话不多,直接上代码,注释在代码里面,不说废话. 二.使用Haar级联进行人脸检测 测试案例: 代码:(记得自己到下载地址下载对应的xml) # coding=gbk """ 作者:川川 @时间 : 2021/9/5 16:3

随机推荐