opencv opencv人脸识别源代码,可以识别出来是谁吗

手把手教你如何用 OpenCV + Python 实现人脸识别_凤凰资讯
手把手教你如何用 OpenCV + Python 实现人脸识别
用微信扫描二维码分享至好友和朋友圈
雷锋网按:本文作者郭璞,原文载于作者,雷锋网已获授权。
下午的时候,配好了OpenCV的Python环境,。于是迫不及待的想体验一下opencv的人脸识别,如下文。
& 必备知识
。通俗的来讲,就是作为人脸特征即可。
Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。
opencv api
要想使用opencv,就必须先知道其能干什么,怎么做。于是API的重要性便体现出来了。就本例而言,使用到的函数很少,也就普通的读取图片,灰度转换,显示图像,简单的编辑图像罢了。
只需要给出待操作的图片的路径即可。
import cv2image = cv2.imread(imagepath)
灰度转换的作用就是:转换成灰度的图片的计算强度得以降低。
import cv2gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
opencv 的强大之处的一个体现就是其可以对图片进行任意编辑,处理。&下面的这个函数最后一个参数指定的就是画笔的大小。
import cv2cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)
编辑完的图像要么直接的被显示出来,要么就保存到物理的存储介质。
import cv2cv2.imshow(&Image Title&,image)
获取人脸识别训练数据
看似复杂,其实就是对于人脸特征的一些描述,这样opencv在读取完数据后很据训练中的样品数据,就可以感知读取到的图片上的特征,进而对图片进行人脸识别。
import cv2face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')
里卖弄的这个xml文件,就是opencv在GitHub上共享出来的具有普适的训练好的数据。我们可以直接的拿来使用。
训练数据参考地址:
说白了,就是根据训练的数据来对新图片进行识别的过程。
import cv2
# 探测图片中的人脸
faces = face_cascade.detectMultiScale( & &gray, & &scaleFactor = 1.15, & &minNeighbors = 5, & &minSize = (5,5), & &flags = cv2.cv.CV_HAAR_SCALE_IMAGE)
我们可以随意的指定里面参数的值,来达到不同精度下的识别。返回值就是opencv对图片的探测结果的体现。
处理人脸探测的结果
结束了刚才的人脸探测,我们就可以拿到返回值来做进一步的处理了。但这也不是说会多么的复杂,无非添加点特征值罢了。
import cv2
print &发现{0}个人脸!&.format(len(faces))
for(x,y,w,h) in faces: & &cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)
有了刚才的基础,我们就可以完成一个简单的人脸识别的小例子了。
下面的这张图片将作为我们的检测依据。&
人脸检测代码
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# & &__author__ = '郭 璞'
# & &__date__ = ''
# & &__Desc__ = 人脸检测小例子,以圆圈圈出人脸
import cv2
# 待检测的图片路径
imagepath = r'./heat.jpg'
# 获取训练好的人脸的参数数据,这里直接从GitHub上使用默认值
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')
# 读取图片
image = cv2.imread(imagepath)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 探测图片中的人脸
faces = face_cascade.detectMultiScale(
& & scaleFactor = 1.15,
& & minNeighbors = 5,
& & minSize = (5,5),
& & flags = cv2.cv.CV_HAAR_SCALE_IMAGE
print &发现{0}个人脸!&.format(len(faces))
for(x,y,w,h) in faces:
& & # cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)
& & cv2.circle(image,((x+x+w)/2,(y+y+h)/2),w/2,(0,255,0),2)
cv2.imshow(&Find Faces!&,image)
cv2.waitKey(0)
人脸检测结果
输出图片:&
输出结果:
D:\Software\Python2\python.exe E:/Code/Python/DataStructor/opencv/Demo.py发现3个人脸!
回顾一下,这次的实验就是简单的对opencv的常用的api的使用,重点在于训练数据的使用和人脸探测的处理。
TensorFlow & 神经网络算法高级应用班” 要开课啦!
从初级到高级,理论 + 实战,一站式深度了解 TensorFlow!
本课程面向深度学习开发者,讲授如何利用 TensorFlow 解决图像识别、文本分析等具体问题。课程跨度为 10 周,将从 TensorFlow 的原理与基础实战技巧开始,一步步教授学员如何在 TensorFlow 上搭建 CNN、自编码、RNN、GAN 等模型,并最终掌握一整套基于 TensorFlow 做深度学习开发的专业技能。
两名授课老师佟达、白发川身为 ThoughtWorks 的资深技术专家,具有丰富的大数据平台搭建、深度学习系统开发项目经验。
时间:每周二、四晚 20:00-21:00
开课时长:总学时 20 小时,分 10 周完成,每周 2 次,每次 1 小时
线上授课地址:http://www.mooc.ai/
雷锋网相关阅读:
用微信扫描二维码分享至好友和朋友圈
凤凰资讯官方微信
播放数:2397175
播放数:593865
播放数:1839468
播放数:5808920502 Bad Gateway
502 Bad Gateway
nginx/1.10.1ROS中OpenCV的使用——人脸检测 | 北京小芽科技
& ROS中OpenCV的使用——人脸检测
5,873 views
Ubuntu12.04
ROS&Hydro&version
OpenCV&2.4.9
特别标注:
这篇文章首发于“北京小芽科技有限公司”的技术博客()上,所有版权归属于北京小芽科技有限公司。更多相关信息请关注北京小芽科技、小芽机器人。&
ROS中,OpenCV的使用,简单一句话概括就是:用ROS获取图像,然后转换成OpenCV的图像格式,后面就是OpenCV图像处理的事情了。
从规范的学习角度来说,大家应该先看看ROS中的vision_opencv功能包集,地址为:
然后再学习里面的功能包cv_bridge,地址为:(C++版本&和&python版本,自选)
如果是简单滴学习使用方式的话,到这里就OK了,如何还想了解ros跟opencv的几何处理或者其他处理方式的话,可以分别了解以下的功能包:
image_geometry、image_common、image_pipeline、image_transport等等
这篇文章主要说明的是简单使用opencv的流程和原理,里面配备了人脸检测的例子。
首先,如果之前没有使用过opencv的话,建议在通用系统里边先装个opencv来玩玩里面的例子,待对opencv有个大体概念时,再转战到ros系统来。
对于ros系统,原理性的东西我就不多说了,这里所说的内容也是以节点为运行单位的。要完成这个流程,需要两个节点:usb_cam设备驱动程序节点&和&图像显示和图像处理节点,同时需要一个主题,即这两个节点的桥梁。
对于usb_cam设备驱动节点来说,是用来从ROS系统里获取摄像头图像的,在我的另外一篇文章《ROS中usb摄像头的使用_(usb_cam)》里边已经做过介绍,这里就不再描述,其实《ROS中usb摄像头的使用_(usb_cam)》里已经使用了opencv,但由于介绍内容的目标不一样,所以这里另外起一篇文章单独进行介绍opencv。
在讲另外一个节点前,先说说两个节点通信的桥梁:主题。其实主题就是一些变量或者结构体的集合,节点可以使用这些变量或结构体作为存储空间(即发布主题),也可以读取它们作为信息处理(订阅主题)。【这里说得比较白话文,目的在于大家好理解,主题里面涉及的内容还很多,可以参阅ros官方文献】
再来看看另外一个节点:图像显示和图像处理节点。这个节点主要就运用了opencv的内容,所以这里就重点描述一下这个节点处理的流程。
在详述之前,先来个图来描述一下上面的内容:
这里边主要的问题在于,ROS图像与opencv图像之间的互相转换。主要涉及到ROS的功能包cv_bridge。这里主要讲讲C++版本的,python版本的原理和C++的一样。
(和官方文档说得差不多,英文好的可以直接看原文
首先来理解一些概念,ROS用sensor_msgs/Image消息格式来传输图像,这个和opencv图像格式不同,这样就需要有一个图像转换的过程。而CvBridge提供了ROS和opencv之间的接口。原理如图所示:
我们再来看看cv_bridge命名空间:
里面的cv::Mat变量即为OpenCV格式图像。也就是我们要把ROS的图像sensor_msgs::Image图像类型转换为cv_bridge图像类型,然后抽取cv_bridge的image变量即为opencv的图像类型数据。
图像的转换,可以使用以下的其中一个函数(根据自己的需求选取,具体使用方式请参阅官方文献)
图像格式转换过来之后,剩下的就是OpenCV图像处理的事情了。图像处理请参阅OpenCV官网的资料和例程。
下来就举一个人脸检测的例子来对上面的内容进行一个实例化的补充说明。
1、&打开终端运行如下两条命令:(启动ROS环境)
2、&usb_cam设备驱动节点跟《ROS中usb摄像头的使用_(usb_cam)》的一样,直接运行即可,运行之后,图像会不断地发布到/camera/image_raw主题上:
3、&图像显示和图像处理节点cvbridge,框架跟《ROS中usb摄像头的使用_(usb_cam)》的一样,只是在里面稍微做些修改即可,这里吧它的源码全部贴出来,里面带了注释,这里我就不多说了。编译之后,可以用以下命令直接运行
编译过程:
编译成功之后,可执行文件节点生成于&“~/catkin_ws_cvbridge/devel/lib/cvbridge”文件夹中
至此,图像接收和显示节点已经构建完成。
在运行程序前,要确保连个模型文件的存在和存放位置:
haarcascade_frontalface_alt.xml&和&haarcascade_eye_tree_eyeglasses.xml
可以到opencv源码目录里去下载:
保存位置,就看你代码怎么写了,如果是绝对路径或者相对路径,就把它们放在对应的路径里边,如果是运行环境路径,就把它们放在指令运行的当前目录里边,比如下面的情况,我是在catkin_ws_cvbridge文件夹里运行rosrun命令的,那我就得把这两个文件放在catkin_ws_cvbridge文件夹里边。
运行以下两个命令来执行节点:(图像接收显示并对图像进行处理)
具体代码如下:
#include &ros/ros.h&
//ros系统头文件集合
#include &image_transport/image_transport.h&
#include &cv_bridge/cv_bridge.h&
#include &sensor_msgs/image_encodings.h&
#include &opencv2/objdetect/objdetect.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &iostream&
#include &stdio.h&
//用于人脸检测的模型文件(另附)
const std::string face_cascade_name = "haarcascade_frontalface_alt.xml";
//用于眼睛检测的模型文件(另附)
const std::string eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
cv::CascadeClassifier face_
cv::CascadeClassifier eyes_
//图像显示窗口的标题名称
static const std::string OPENCV_WINDOW = "Image window";
class ImageConverter
//节点句柄
ros::NodeHandle nh_;
//用来发布和订阅ROS系统的图像
image_transport::ImageTransport it_;
//订阅主题的变量
image_transport::Subscriber image_sub_;
//发布主题的变量
image_transport::Publisher image_pub_;
ImageConverter(): it_(nh_)
// Subscrive to input video feed and publish output video feed
image_sub_ = it_.subscribe("/camera/image_raw", 1, &ImageConverter::imageCb2, this);
//"/camera/rgb/image_color "为Kinect输出彩色图像的Topic
//发布主题
image_pub_ = it_.advertise("/image_converter/output_video", 1);
//加载级联分类器文件
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); };
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); };
//命名窗口
cv::namedWindow(OPENCV_WINDOW);
~ImageConverter()
cv::destroyWindow(OPENCV_WINDOW);
//订阅主题的回调函数
void imageCb2(const sensor_msgs::ImageConstPtr& msg)//Callback2
cv_bridge::CvImagePtr cv_
//将sensor_msgs::Image数据类型转换为cv::Mat类型(即opencv的IplImage格式)
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
catch (cv_bridge::Exception& e)
ROS_ERROR("cv_bridge exception: %s", e.what());
//至此,ROS图像和OpenCV图像转换完毕
if(!cv_ptr-&image.empty())
//利用OpenCV对图像进行处理
detectAndDisplay(cv_ptr-&image);
printf(" No captured frame. Break");
cv::waitKey(3);
// Output modified video stream
image_pub_.publish(cv_ptr-&toImageMsg());
//图像处理过程(人脸检测和眼睛检测)
void detectAndDisplay( Mat frame )
std::vector&Rect&
cv::Mat frame_
cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );
//-- 多尺寸检测人脸
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( int i = 0; i & faces.size(); i++ )
Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar
( 255, 0, 255 ), 4, 8, 0 );
Mat faceROI = frame_gray( faces[i] );
std::vector&Rect&
//-- 在每张人脸上检测双眼
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( int j = 0; j & eyes.size(); j++ )
Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
int radius = cvRound( (eyes[j].width + eyes[i].height)*0.25 );
circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
//-- 显示结果图像
imshow( OPENCV_WINDOW, frame );
int main(int argc, char** argv)
//ros节点的初始化
ros::init(argc, argv, "image_converter");
//图像获取处理并显示的类,初始化实例的过错即为处理的过程
//ros::spin()进入自循环,当ros::ok()返回FALSE时,ros::spin()就立刻跳出循环
//这很可能是ros::shutdown()被调用,或者用户按下了Ctrl+C退出组合键
ros::spin();
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
#include &ros/ros.h&&&&&//ros系统头文件集合#include &image_transport/image_transport.h&#include &cv_bridge/cv_bridge.h&#include &sensor_msgs/image_encodings.h& #include &opencv2/objdetect/objdetect.hpp&#include &opencv2/imgproc/imgproc.hpp&#include &opencv2/highgui/highgui.hpp&&#include &iostream&#include &stdio.h&&using namespace std;using namespace cv;&//用于人脸检测的模型文件(另附)const std::string face_cascade_name = "haarcascade_frontalface_alt.xml";//用于眼睛检测的模型文件(另附)const std::string eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";cv::CascadeClassifier face_cascade;cv::CascadeClassifier eyes_cascade;&//图像显示窗口的标题名称static const std::string OPENCV_WINDOW = "Image window";&class ImageConverter{&&//节点句柄&&ros::NodeHandle nh_; &&//用来发布和订阅ROS系统的图像&&image_transport::ImageTransport it_;&&//订阅主题的变量 &&image_transport::Subscriber image_sub_;&&//发布主题的变量&&image_transport::Publisher image_pub_;&public:&&ImageConverter(): it_(nh_)&&{&&&&// Subscrive to input video feed and publish output video feed&&&&image_sub_ = it_.subscribe("/camera/image_raw", 1, &ImageConverter::imageCb2, this); &&&&//"/camera/rgb/image_color "为Kinect输出彩色图像的Topic&&&&&//发布主题&&&&image_pub_ = it_.advertise("/image_converter/output_video", 1);&&&&&&&&//加载级联分类器文件&&&&if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); };&&&&if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); };&&&&&&&&//命名窗口&&&&cv::namedWindow(OPENCV_WINDOW);&&}&&&~ImageConverter()&&{&&&&cv::destroyWindow(OPENCV_WINDOW);&&}&&&&//订阅主题的回调函数&&void imageCb2(const sensor_msgs::ImageConstPtr& msg)//Callback2&&{&&&&cv_bridge::CvImagePtr cv_ptr;&&&&try&&&&{&&&&&&//将sensor_msgs::Image数据类型转换为cv::Mat类型(即opencv的IplImage格式)&&&&&&cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);&&&&}&&&&catch (cv_bridge::Exception& e)&&&&{&&&&&&ROS_ERROR("cv_bridge exception: %s", e.what());&&&&&&return;&&&&}&&&&&&&&//至此,ROS图像和OpenCV图像转换完毕&&&&if(!cv_ptr->image.empty())&&&&{ &&&&&&//利用OpenCV对图像进行处理&&&&&&detectAndDisplay(cv_ptr->image);&&&&}&&&&else &&&&{&&&&&&printf(" No captured frame. Break");&&&&}&&&&&&&&cv::waitKey(3);&&&&&&&&// Output modified video stream&&&&image_pub_.publish(cv_ptr->toImageMsg());&&}&&&&//图像处理过程(人脸检测和眼睛检测)&&void detectAndDisplay( Mat frame )&&{&&&&std::vector<Rect> faces;&&&&cv::Mat frame_gray;&&&&&cvtColor( frame, frame_gray, CV_BGR2GRAY );&&&&equalizeHist( frame_gray, frame_gray );&&&&&//-- 多尺寸检测人脸&&&&face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );&&&&&for( int i = 0; i < faces.size(); i++ )&&&&{&&&&&&&&Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );&&&&&&&&ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar&&( 255, 0, 255 ), 4, 8, 0 );&&&&&&&&&Mat faceROI = frame_gray( faces[i] );&&&&&&&&std::vector<Rect> eyes;&&&&&&&&&//-- 在每张人脸上检测双眼&&&&&&&&eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );&&&&&&&&&for( int j = 0; j < eyes.size(); j++ )&&&&&&&&{&&&&&&&&&&&&Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );&&&&&&&&&&&&int radius = cvRound( (eyes[j].width + eyes[i].height)*0.25 );&&&&&&&&&&&&circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );&&&&&&&&}&&&&}&&&&&&&&//-- 显示结果图像&&&&imshow( OPENCV_WINDOW, frame );&&}};&//主函数int main(int argc, char** argv){&&//ros节点的初始化&&ros::init(argc, argv, "image_converter");&&&&//图像获取处理并显示的类,初始化实例的过错即为处理的过程&&ImageConverter ic;&&&&//ros::spin()进入自循环,当ros::ok()返回FALSE时,ros::spin()就立刻跳出循环&&//这很可能是ros::shutdown()被调用,或者用户按下了Ctrl+C退出组合键&&ros::spin();&&&&return 0;}
成功运行之后,显示如下:(摄像头图像不是很流畅)
参考文献:
链接地址为:
链接地址为:
链接地址为:
Jason.Que&于&小芽科技
<span style="font-family:宋体;font-size:10.5年10月11日
您可能也喜欢:
Ubuntu12.04
ROS&Hydro&version
特别标注:
这篇文章首发于“北京小芽科技有限公司”的技术博客()上...
你必须启用JavaScript才能看到这里的验证码!
3,685 views拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(39c111bba6048a07-ua98).
重新安装浏览器,或使用别的浏览器本篇文章主要介绍了如何使用OpenCV实现人脸检测。本文不具体讲解人脸检测的原理,直接使用OpenCV实现。
OpenCV版本:2.4.10;VS开发版本:VS2012。
一、OpenCV人脸检测
要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操作。
1、OpenCV人脸检测的方法
在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。
在OpenCV中,使用已经训练好的XML&#26684;式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到下图所示的内容:
上图中文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。&haar&特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。打开“haarcascades”文件夹,如下图所示
图中的XML文件即是我们人脸检测所需要的分类器文件。在实际使用中,推荐使用上图中被标记的“haarcascade_frontalface_alt2.xml”分类器文件,准确率和速度都比较好。
2、OpenCV中的人脸检测的类
在OpenCV中,使用类“CascadeClassifier”进行人脸检测
CascadeClassifier faceC
//实例化对象
所需要使用的函数:
faceCascade.load(&../data/haarcascade_frontalface_alt2&);
//加载分类器
faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));
//多尺寸检测人脸
实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:
CV_WRAP virtual void detectMultiScale( const Mat& image,
CV_OUT vector&Rect&& objects,
double scaleFactor=1.1,
int minNeighbors=3, int flags=0,
Size minSize=Size(),
Size maxSize=Size() );
各参数含义:
const Mat& image: 需要被检测的图像(灰度图)vector&Rect&& objects: 保存被检测出的人脸位置坐标序列double scaleFactor: 每次图片缩放的比例int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸int flags: 决定是缩放分类器来检测,还是缩放图像Size(): 表示人脸的最大最小尺寸
二、代码实现
1、检测图片中的人脸
#include&opencv2/objdetect/objdetect.hpp&
#include&opencv2/highgui/highgui.hpp&
#include&opencv2/imgproc/imgproc.hpp&
//人脸检测的类
CascadeClassifier faceC
int main()
faceCascade.load(&../data/haarcascade_frontalface_alt2.xml&);
//加载分类器,注意文件路径
Mat img = imread(&../data/PrettyGirl.jpg&);
vector&Rect&
if(img.empty())
if(img.channels() ==3)
cvtColor(img, imgGray, CV_RGB2GRAY);
faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));
//检测人脸
if(faces.size()&0)
for(int i =0; i&faces.size(); i++)
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(0, 255, 0), 1, 8);
//框出人脸位置
imshow(&FacesOfPrettyGirl&, img);
waitKey(0);
结果如下图:
2、检测视频中的人脸
#include&opencv2/objdetect/objdetect.hpp&
#include&opencv2/highgui/highgui.hpp&
#include&opencv2/imgproc/imgproc.hpp&
//人脸检测的类
CascadeClassifier faceC
int main()
faceCascade.load(&../data/haarcascade_frontalface_alt2.xml&);
//加载分类器,注意文件路径
cap.open(0);
//打开摄像头
//cap.open(&../data/test.avi&);
//打开视频
Mat img, imgG
vector&Rect&
int c = 0;
if(!cap.isOpened())
while(c!=27)
if(img.channels() ==3)
cvtColor(img, imgGray, CV_RGB2GRAY);
faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));
//检测人脸
if(faces.size()&0)
for(int i =0; i&faces.size(); i++)
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(0, 255, 0), 1, 8);
//框出人脸位置
imshow(&Camera&, img);
c = waitKey(1);
在视频实时检测时,可能会出现卡顿,是因为检测人脸花费了过多的时间,这里代码只实现基本功能,并未优化。
本文已收录于以下专栏:
相关文章推荐
【OpenCV第一篇】安装OpenCV本篇主要介绍如何下载OpenCV安装程序,如何在VS2008下安装配置OpenCV,文章最后还介绍了一个使用OpenCV的简单小例子。《OpenCV入门指南》系列...
在之前OpenCV实践之路——人脸识别之一数据收集和预处理和OpenCV实践之路——人脸识别之二模型训练两篇博客中,已经把人脸识别的整个流程全部交代清楚了。包括今天这篇人脸识别方面的内容都已经在上述第...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 基于opencv的人脸识别 的文章

 

随机推荐