opencv 做人脸识别 opencv 人脸匹配分析

2016-02-19 11:54 175 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享opencv 做人脸识别 opencv 人脸匹配分析教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - 编程语言 】

机器学习
机器学习的目的是把数据转换成信息。
机器学习通过从数据里提取规则或模式来把数据转成信息。

人脸识别
人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。
每个节点的正确识别率很高,但正确拒绝率很低。
任一节点判断没有人脸特征则结束运算,宣布不是人脸。
全部节点通过,则宣布是人脸。
工业上,常用人脸识别技术来识别物体。

对图片进行识别
代码如下:

#include "opencv2/core/core.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include iostream
#include stdio.h

using namespace std;
using namespace cv;

string face_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
string window_name = "人脸识别";

void detectAndDisplay( Mat frame );

int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("[error] 没有图片n");
return -1;
}

if( !face_cascade.load( face_cascade_name ) ){
printf("[error] 无法加载级联分类器文件!n");
return -1;
}

detectAndDisplay(image);

waitKey(0);
}

void detectAndDisplay( Mat frame ){
std::vectorRect faces;
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 );
}

imshow( window_name, frame );
}


CascadeClassifier类

class CascadeClassifier

用于检测物体的级联分类器类。

CascadeClassifier::CascadeClassifier
从一个文件读取分类器。

C++: CascadeClassifier::CascadeClassifier(const string& filename)
参数 filename – 所要读取分类器文件的文件名
参数filename – 所要读取分类器文件的文件名
CascadeClassifier::empty
检查分类器是否已经载入。

C++: bool CascadeClassifier::empty() const
CascadeClassifier::load
从一个文件读取分类器。

C++: bool CascadeClassifier::load(const string& filename)
参数 filename – 所要读取分类器文件的文件名。文件可以是旧版的HAAR分类器模型也可以是新版的分类器模型。
参数filename – 所要读取分类器文件的文件名。文件可以是旧版的HAAR分类器模型也可以是新版的分类器模型。
CascadeClassifier::read
读取一个文件存储节点的分类器。

C++: bool CascadeClassifier::read(const FileNode& node)


CascadeClassifier::detectMultiScale
对不同大小的输入图像进行物体识别,并返回一个识别到的物体的矩阵列表。

C++: void CascadeClassifier::detectMultiScale(const Mat& image, vectorRect& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size()) 
参数image – 需要检测的 CV_8U 输入矩阵。 objects – 输出vector载体容器用于保存被识别的物体矩阵。 scaleFactor – 指定每张图片的缩小比例的参数。 minNeighbors – 指定每个候选矩阵至少包含的邻近元素个数。 flags与旧版级联分类器模型函数cvHaarDetectObjects的flags相同. 此参数不被用于新版模型。 minSize – 最小可能的对象的大小,小于的对象将被忽略。 maxSize – 最大可能的对象的大小,大于的对象将被忽略。
CascadeClassifier::setImage
设置被用于检测的图像。

C++: bool CascadeClassifier::setImage(PtrFeatureEvaluator& feval, const Mat& image)
参数feval – 用于特征计算的特征求值程序的指针。 image – 需要进行特征检测的 CV_8U 输入矩阵。
这个函数将在每张图片中被 CascadeClassifier::detectMultiScale() 自动调用。 但如果你想在不同位置手动使用 CascadeClassifier::runAt(),你需要先调用该函数,使得图像被积分计算。

CascadeClassifier::runAt
在指定点运行检测。

C++: int CascadeClassifier::runAt(PtrFeatureEvaluator& feval, Point pt, double& weight) 
参数

feval – 用于特征计算的特征求值程序。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

pt – 指定检测窗口左上角的点。窗口的大小和检测的图片大小一致。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
如果级联分类器检测到给定的位置中的一个对象,该函数返回1。否则,它会返回已被否决的候选区域在哪个阶段的否定的指数。

使用CascadeClassifier::setImage() 设置图像的检测工作。

代码注释

代码如下:

//需要载入的级联分类器文件
string face_cascade_name = "haarcascade_frontalface_alt.xml";
//级联分类器类
CascadeClassifier face_cascade;

//……

//载入级联分类器,并判断是否载入成功,如果不成功则打印提示
if( !face_cascade.load( face_cascade_name ) ){
printf("[error] 无法加载级联分类器文件!n");
return -1;
}

//……

//对图片frame进行识别检测
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

转换成灰度图

由于CascadeClassifier类只支持CV_8U矩阵数据,所以我们需要将图片变成灰度图。

cvtColor API:

将图片从一个色彩空间转到另一个色彩空间。

C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
参数src – 输入图像:8位无符号,16位无符号(CV_16UC...),或单精度浮点数据类型。 dst – 输出图像,与输入图像相同大小、深度。 code – 颜色空间转换代码。 dstCn – 目标图像的通道数,当该参数为0时,则通道树由src和code自动得出。
该函数将输入图片从一个色彩空间转到另一个色彩空间。当从RGB颜色空间进行变换时,应明确指定的信道的顺序(RGB或BGR)。值得注意,在OpenCV的默认颜色格式中,通常被称为作为RGB,但实际上是BGR(字节是相反的)。因此,在一个标准的(24位)的彩色图像的第一个字节是一个8位的蓝色分量,第二个字节将是绿色的,第三个字节将是红色的。而第四,第五,和第六字节,则是第二像素(蓝,然后绿色,然后红色),依此类推。

R、G和B 通道通常信道值范围

CV_8U:0 — 255
CV_16U:0 — 65535
CV_32F:0 — 1
线性变换的情况下,有没有范围是无所谓的。但是,在一个非线性变换的情况下,输入的RGB图像应被归为适当的值范围内,以得到正确的结果。例如,如果你有一个32位浮点图像直接转换成一个8位的图像而没有任何缩放,那么它将有0到255的数值范围,而这并不能准确0..1所有浮点数的值。所以,你需要之前调用cvtColor,进行图像缩放。

代码注释:
代码如下:

//将frame转换成灰度图,输出到frame_gray
cvtColor( frame, frame_gray, CV_BGR2GRAY );

直方图均衡化

直方图是图像中像素强度分布的图形表达方式。
它统计了每一个强度值所具有的像素个数。
http://www.cnblogs.com/http://www.cnblogs.com/../_images/Histogram_Equalization_Theory_0.jpg 
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。
说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.
http://www.cnblogs.com/http://www.cnblogs.com/../_images/Histogram_Equalization_Theory_1.jpg 
我们利用直方图均衡化对图片增强对比度,方便级联分类器分析。

equalizeHist API:

对灰度图像进行直方图均衡。

C++: void equalizeHist(InputArray src, OutputArray dst)

table4
直方图均衡函数使用了下列的算发:

计算源文件的直方图H 。

调整直方图,使得其方格总个数为255。

对直方图进行积分:

H'_i = sum _{0 le j < i} H(j)

使用H'变换图片,其映射函数为:texttt{dst}(x,y) = H'(texttt{src}(x,y))

该算法归一化亮度并增加了图像的对比度。

来源:http://www.tulaoshi.com/n/20160219/1599032.html

延伸阅读
借贷宝人脸识别在哪设置?   借贷宝人脸识别版是一款需要经过肖像身份认证才能使用的手机借贷宝,是九鼎最新发行的一项新功能,极大程度的保障了用户的财产安全哦。借贷宝人脸识别在哪设置?怎么弄?下面就请随图老师小编一起来看看借贷宝人脸识别设置教程吧! 首先,在我中,选择钱包。 在钱包中,你可以看到肖像认证,这...
标签: 手机软件
具体 手机QQ人脸识别登陆功能在哪儿设置呢?我们必须要告诉你,设置地方相当的隐秘。 首先,你需要在你的 iPhone 上下载安装腾讯“QQ安全中心”,你可以进入 App Store 搜索【QQ安全中心】 然后、打开QQ安全中心后,需要使用自己的QQ账号和密码登陆,登陆之后,还需要手机验证,也就是QQ绑定的手机号接收短信验证,如下图...
标签: 服务器
Linux Deepin 2013发布:加入人脸识别功能   2013年是不平凡的一年,自这一年的1月28日开始,我们相继发布了12.12 Alpha、Beta、RC、12.12正式版、12.12.1增强版等多个版本。Linux Deepin的新桌面环境从优秀的用户体验着手,在Linux桌面发展领域做出了多项尝试和创新,也在一个个版本中逐步走向成熟和稳定。在此期间,无数社区爱好...
诺基亚人脸识别手机解锁的软件:Facelock 通过人脸识别来为手机解锁的软件见过没?近日,编辑在诺基亚应用商店发现了一款软件Facelock,将帮助诺基亚手机实现这一功能。 用户只要用前置摄像头拍摄一张面部照片,将这张照片设置成解锁密码,要想进入手机就需要前置摄像头来对你的面部进行扫描,只有和预设好的照片相匹配才能进入。 ...
手机qq怎么用人脸识别登入   具体 手机QQ人脸识别登陆功能在哪儿设置呢?我们必须要告诉你,设置地方相当的隐秘。 首先,你需要在你的 iPhone 上下载安装腾讯QQ安全中心,你可以进入 App Store 搜索 然后、打开QQ安全中心后,需要使用自己的QQ账号和密码登陆,登陆之后,还需要手机验证,也就是QQ绑定的手机号接收短信验...

经验教程

528

收藏

80
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部