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

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

第一章:反思与总结

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

第二章:图片中的人脸检测

啥也不说,先上效果图大笑:

下面是福利图了,图中有志玲姐姐(安静):

可惜没匹配上,很伤心~~~~

有人可能会问这么漂亮的背景图是这么高的,下面是代码~

void CmyFaceDetectDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 用于绘制的设备上下文 

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 

  // 使图标在工作区矩形中居中
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2; 

  // 绘制图标
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  /*改变对话框背景****若需要默认背景,可以删除*/
  CPaintDC dc(this);
  CRect rect;
  GetClientRect(&rect);
  CDC dcBmp;
  dcBmp.CreateCompatibleDC(&dc);
  CBitmap bmpBackGround;
  bmpBackGround.LoadBitmap(<span style="color:#FF6666;">IDB_BEIJING</span>);//IDB_BEIJING是背景的图片ID,在资源视图中插入资源,选择BITMAP
BITMAP m_bitmap;  //上传图片(BMP)格式,将ID设为一致就好了
bmpBackGround.GetBitmap(&m_bitmap);
CBitmap *pbmpOld = dcBmp.SelectObject(&bmpBackGround);
dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
CDialogEx::OnPaint();
}}

好了,下面进入正题,如何实现图片中的人脸匹配,见代码,后面有详细解释:

void CmyFaceDetectDlg::OnBnClickedFacedetect()
{
 // TODO: 在此添加控件通知处理程序代码
 CString filename;
 //打开对话框
 CFileDialog OpenDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR,
  _T("图片 (*.jpg)|*.jpg|(*.*) |*.*|"), NULL);
 if (OpenDlg.DoModal() != IDOK)
 {
  return;
 }
 filename = OpenDlg.GetPathName();//获得文件路径
 /*CString转换*string*/
 USES_CONVERSION;//USES_CONVERSION是用来转换类型的
 //USES_CONVERSION它是在堆栈上分配空间的,也就是说你在你在函数未结束就不会被释放掉。所有要注意不要在一个函数中用while循环执行它,不然栈空间就马上会分配完(栈空间一般只有2M,很小)
 std::string tempName(W2A(filename));//转换过程
 image = imread(tempName);//读取图片
 const String cascade_name = "./haarcascade_frontalface_alt2.xml";//加载人脸库
 if (!cascade.load(cascade_name))
 {
  MessageBox(_T("ERROR:Could not load cascade!"));
  return;
 }
 if (!image.data)
 {
  MessageBox(_T("ERROR:Could not load image!"));
  return;
 }
 namedWindow("人脸检测", CV_WINDOW_AUTOSIZE);
 detectAndDraw(image, cascade, scale);//调用人脸检测函数
 imshow("人脸检测", image);
 return;
} 

void CmyFaceDetectDlg::detectAndDraw(Mat& img, CascadeClassifier& cascade, double scale)
{
 /*程序核心函数,检测标记人脸*/
 int i = 0;
 vector<Rect>faces;//定义一个容器,保存检测结果
 const static Scalar colors[] = {
  CV_RGB(0, 0, 255),
  CV_RGB(0, 128, 255),
  CV_RGB(0, 255, 255),
  CV_RGB(0, 255, 0),
  CV_RGB(255, 128, 0),
  CV_RGB(255, 255, 0),
  CV_RGB(255, 0, 0),
  CV_RGB(255, 0, 255)
 };
 Mat gray, smallImage(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);//用cvRound取整
 cvtColor(img, gray, CV_BGR2GRAY);//转化灰度图
 resize(gray, smallImage, smallImage.size(), 0, 0, INTER_LINEAR);//图片尺度调整,将gray调整为smallImage.size大小,方法为INTER_LINEAR:局部像素的重采样
 equalizeHist(smallImage, smallImage);//直方图均衡
 cascade.detectMultiScale(smallImage, faces);//核心,检测人脸
 //const_iterator迭代器,是不能改变r所指向的元素的值的
 for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++)
 {
  //利用迭代器,标记出人脸位置。
  Point center;
  Scalar color = colors[i % 8];
  int radius;
  /*计算出原图像中的圆心和半径。公式很简单,自己写一下,就可以理解了*/
  center.x = cvRound((r->x + r->width*0.5)*scale);
  center.y = cvRound((r->y + r->height*0.5)*scale);
  radius = cvRound((r->width + r->height)*0.25*scale);
  circle(img, center, radius, color, 2);
 }
} 

注意我是在一个MFC的对话框中,这个界面图中按下“图片”button后的操作。

第三章:视频中的人脸检测

其实,和图片中的原理是一样的。因为视频又一帧一帧的图片组成,我们设定一个短的时间间隔,就可以更图片一样了。
先看效果吧:(说明,该视频是一个女子在跳芭蕾舞,我截去3张图片来达到以点概面的效果)

下面见代码:

void CmyFaceDetectDlg::OnBnClickedFacev()
{
 // TODO: 在此添加控件通知处理程序代码
 //检测视频帧中的人脸
 CString filename;
 CFileDialog OpenDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR,
  _T("视频(*.avi)|*.avi|(*.*)|*.*|"), NULL);
 if (OpenDlg.DoModal() != IDOK)
 {
  return;
 }
 /*CString转换*string*/
 filename = OpenDlg.GetPathName();
 USES_CONVERSION;
 std::string tempName(W2A(filename));
 const String cascade_name = "./haarcascade_frontalface_alt2.xml";
 if (!cascade.load(cascade_name))
 {
  MessageBox(_T("ERROR:Could not load cascade!"));
  return;
 }
 VideoCapture capture(tempName);//打开视频
 if (!capture.isOpened())
 {
  MessageBox(_T("ERROR:Could not load Video!"));
  return;
 }
 double rate = capture.get(CV_CAP_PROP_FPS);
 bool stop(false);
 int delay = 1000 / rate;
 while (!stop)
 {
  if (!capture.read(image))//读取视频帧
   break;
  detectAndDraw(image, cascade, scale);
  imshow("人脸检测", image);
  if (waitKey(delay) >= 0)
   stop = true;
 }
 capture.release();
 return;
}

第四章:总结

人脸匹配最总要的是如何生成匹配库,也是检测的方法的差别。库的生成和机器学习密切相关,学习永无止境,努力吧!

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

您可能感兴趣的文章:

  • OpenCV实现人脸检测
  • 基于openCV实现人脸检测
  • C++利用opencv实现人脸检测
(0)

相关推荐

  • C++利用opencv实现人脸检测

    小编所有的帖子都是基于unbuntu系统的,当然稍作修改同样试用于windows的,经过小编的绞尽脑汁,把刚刚发的那篇python 实现人脸和眼睛的检测的程序用C++ 实现了,当然,也参考了不少大神的博客,下面我们就一起来看看: Linux系统下安装opencv我就再啰嗦一次,防止有些人没有安装没调试出来喷小编的程序是个坑, sudo apt-get install libcv-dev sudo apt-get install libopencv-dev 看看你的usr/share/opencv

  • 基于openCV实现人脸检测

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

  • OpenCV实现人脸检测

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

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

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

  • Python+OpenCV实现图片及视频中选定区域颜色识别

    近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步优化,但提升有限. 主要实现过程:按不同颜色的取值范围,对图像进行循环遍历,转换为灰度图,将本次遍历的颜色像素转换为白色,对白色部分进行膨胀处理,使其更加连续,计算白色部分外轮廓包围的面积累加求和,比较每种颜色围起来面积,保存最大值及其颜色,所有颜色遍历完后,返回最大值对应的颜色,显示在图像上 如果有类似的颜色识别的任务,可参考以下代码修改后实现具

  • JavaCV实现人脸检测功能

    本文实例为大家分享了JavaCV实现人脸检测功能的具体代码,供大家参考,具体内容如下 /* * Copyright (C) 2010,2011,2012 Samuel Audet * * FacePreview - A fusion of OpenCV's facedetect and Android's CameraPreview samples, * with JavaCV + JavaCPP as the glue in between. * * This file was based o

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

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

  • Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt from time import sleep cascPath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeCla

  • 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

  • 对Python+opencv将图片生成视频的实例详解

    如下所示: import cv2 fps = 16 size = (width,height) videowriter = cv2.VideoWriter("a.avi",cv2.VideoWriter_fourcc('M','J','P','G'),fps,size) for i in range(1,200): img = cv2.imread('%d'.jpg % i) videowriter.write(img) 以上这篇对Python+opencv将图片生成视频的实例详解就是

  • Opencv python 图片生成视频的方法示例

    本文主要介绍了Opencv图片生成视频,分享给大家,具体如下: 生成视频 import random as rd import cv2 as cv import numpy as np # 保存视频 class RecordMovie(object): def __init__(self, img_width, img_height): self.video_writer = None # 视频对象 self.is_end = False # 结束保存视频 self.img_width = im

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

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

  • 基于Python实现视频的人脸融合功能

    ​ 图片提取 为了方便技术展示,我们选取素材为演员杨紫的一段演讲视频,用例仅为技术交流演示使用,不针对任何指定人. 为达到我们AI换脸的目的,我们首先需要将这段视频逐帧提取成照片 def vedio_2_pic(self,file,save_path): """ 逐帧取照片 file:视频的位置 save_path:保存路径 """ # 读取视频 video = cv2.VideoCapture(file) # 获取视频帧率 fps = vide

随机推荐