openCV学习日志(三) 图像的人脸识别
2017-07-25 18:58
387 查看
本篇主要介绍图像的人脸识别算法,示例程序如下:
挑选图片进行处理,执行结果如下:
在该程序中,我们使用opencv自带的Haar特征检测分类器对图片进行检测,并对人脸进行标识。
一、cvtColor() 颜色空间转换函数
C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
功能:在图像处理中,将一个颜色空间(如RGB颜色空间)的图像转换为其他颜色空间的图像,如灰度图、二值图、HSV图等等。在参数列表中,InputArray src为输入图像,OutputArray dst为输出图像,code为转换标志,例如CV_BGR2GRAY、COLOR_BGR2HSV等等。
二、waitKey() 延时函数
C++: int waitKey(int delay=0)
其中delay为延时时间(单位为ms),delay=0表示窗口会一直显示。
当delay<0时,窗口会等待一个给定的按键指令以结束。
PS:该函数只在有higui图形窗口存在时才有作用。
三、vector<cv::Rect> faces
vector是C++标准模版库(STL)中的内容,是一个能存放任意类型数据的动态数组。其使用方式为:
vector<数据类型名> 变量名
cv::Rect opencv中定义的矩形类
四、DWORD
MFC中的数据类型, 为unsighed long
GetTickCount() 返回OS从启动到现在经过的时间,经常用于确认代码的运行时间。
五、detectMultiScale() 人脸检测函数
opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示),函数由分类器对象调用。
image--待检测图片,一般为灰度图像加快检测速度;
objects--被检测物体的矩形框向量组;
scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上;
flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为
CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,
因此这些区域通常不会是人脸所在区域;
minSize和maxSize用来限制得到的目标区域的范围。
六、vector<cv::Rect>::const_iterator 迭代器
定义 相应类型的迭代器,需要注意的是,const_iterator只能访问变量,不能改变变量的值。
七、cvRound 近似函数
int cvRound(double x) 返回跟参数最接近的整数值;
八、circle() 画圆函数
cvCircle(CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0)
img为源图像指针
center为画圆的圆心坐标
radius为圆的半径
colo
8f51
r为设定圆的颜色
thickness 如果是正数,表示组成圆的线条的粗细程度
line_type 线条的类型。默认是8
shift 圆心坐标点和半径值的小数点位数
下篇将介绍关于人脸识别程序的进一步分析。
#include <Windows.h> #include <vector> #include <iostream> #include <string> #include <opencv2\opencv.hpp> using namespace std; using namespace cv; int main(int argc, char* argv[]) { //加载Haar特征检测分类器 CascadeClassifier cascade; cascade.load("D:\\Program Files\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"); // 载入图像 const string pstrImageName = "2.jpg"; Mat SrcImage = imread(pstrImageName, CV_LOAD_IMAGE_COLOR); Mat GrayImage; cvtColor(SrcImage, GrayImage, CV_BGR2GRAY); //转换为灰度图 //人脸识别与标记 if (cascade.empty()) cout << "未加载分类器" << endl; //判断分类器 CvScalar FaceCirclecolors[] = { { { 0, 0, 255 } }, { { 0, 128, 255 } }, { { 0, 255, 255 } }, { { 0, 255, 0 } }, { { 255, 128, 0 } }, { { 255, 255, 0 } }, { { 255, 0, 0 } }, { { 255, 0, 255 } } }; //标记圆的颜色 vector<cv::Rect> faces; DWORD dwTimeBegin, dwTimeEnd; dwTimeBegin = GetTickCount(); // 识别 cascade.detectMultiScale(GrayImage, faces); dwTimeEnd = GetTickCount(); cout << "人脸个数:" << faces.end() - faces.begin() << "识别用时:" << dwTimeEnd - dwTimeBegin << "ms\n"; // 标记 int n = 0; for (vector<cv::Rect>::const_iterator i = faces.begin(); i <faces.end(); i++, n++) { Point center; int radius; center.x = cvRound((i->x + i->width * 0.5)); center.y = cvRound((i->y + i->height * 0.5)); radius = cvRound((i->width + i->height) * 0.25); circle(SrcImage, center, radius, FaceCirclecolors[n % 8], 2); } imshow("src", SrcImage); waitKey(); }
挑选图片进行处理,执行结果如下:
在该程序中,我们使用opencv自带的Haar特征检测分类器对图片进行检测,并对人脸进行标识。
一、cvtColor() 颜色空间转换函数
C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
功能:在图像处理中,将一个颜色空间(如RGB颜色空间)的图像转换为其他颜色空间的图像,如灰度图、二值图、HSV图等等。在参数列表中,InputArray src为输入图像,OutputArray dst为输出图像,code为转换标志,例如CV_BGR2GRAY、COLOR_BGR2HSV等等。
二、waitKey() 延时函数
C++: int waitKey(int delay=0)
其中delay为延时时间(单位为ms),delay=0表示窗口会一直显示。
当delay<0时,窗口会等待一个给定的按键指令以结束。
PS:该函数只在有higui图形窗口存在时才有作用。
三、vector<cv::Rect> faces
vector是C++标准模版库(STL)中的内容,是一个能存放任意类型数据的动态数组。其使用方式为:
vector<数据类型名> 变量名
cv::Rect opencv中定义的矩形类
typedef struct CvRect { int x; /* 方形的左上角的x-坐标 */ int y; /* 方形的左上角的y-坐标*/ int width; /* 宽 */ int height; /* 高 */ }其中,变量名可以调用begin()和end()函数,返回矩形类的起始和末端迭代器,迭代器的作用相当于加强的指针,可以通过*访问vector中的元素。同时,指向a的迭代器可以通过->操作符访问a的内部成员。
四、DWORD
MFC中的数据类型, 为unsighed long
GetTickCount() 返回OS从启动到现在经过的时间,经常用于确认代码的运行时间。
五、detectMultiScale() 人脸检测函数
opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示),函数由分类器对象调用。
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() );
image--待检测图片,一般为灰度图像加快检测速度;
objects--被检测物体的矩形框向量组;
scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上;
flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为
CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,
因此这些区域通常不会是人脸所在区域;
minSize和maxSize用来限制得到的目标区域的范围。
六、vector<cv::Rect>::const_iterator 迭代器
定义 相应类型的迭代器,需要注意的是,const_iterator只能访问变量,不能改变变量的值。
七、cvRound 近似函数
int cvRound(double x) 返回跟参数最接近的整数值;
八、circle() 画圆函数
cvCircle(CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0)
img为源图像指针
center为画圆的圆心坐标
radius为圆的半径
colo
8f51
r为设定圆的颜色
thickness 如果是正数,表示组成圆的线条的粗细程度
line_type 线条的类型。默认是8
shift 圆心坐标点和半径值的小数点位数
下篇将介绍关于人脸识别程序的进一步分析。
相关文章推荐
- 人脸识别《一》opencv人脸识别之收集人脸并学习
- opencv学习(九)图像绘制DrawEllipse/ Drawpolygon/ DrawFilledCircle/ DrawFilledCircle/ Rectangle(无法识别标识符,待解
- 图像项目-基于opencv的人脸识别
- 图像识别 python+opencv的简单人脸识别
- OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读
- 【图像识别】 Python+Opencv调用摄像头实现人脸识别并保存视频
- 基于OpenCV的PHP图像人脸识别技术
- opencv学习之Adaboost算法进行人脸识别
- 基于OpenCv的人脸检测、识别系统学习制作笔记之三
- 图像识别 python+opencv的简单人脸识别
- 【从零学习openCV】IOS7人脸识别实战
- 【OpenCV学习笔记 022】人脸识别 小试牛刀
- C# OpenCV学习笔记六之人脸识别/五官识别测试
- opencv学习-pca人脸识别
- 资料网址大全 (数学,深度学习,机器学习,计算机视觉,人脸识别,图像处理等)
- 接深度学习,opencv人脸识别,目标检测等项目
- opencv学习(十)(opencv3.0.0+VS2012+win7)打开摄像头并且进行人脸识别的例子
- Opencv 入门学习之图片人脸识别
- ios学习之基于 OpenCV的人脸识别
- 【opencv学习】图像处理和图像识别中常用的OpenCV函数