C++ 人脸识别技术简要概述 使用技术为OpenCV 24+

  • 格式:doc
  • 大小:122.00 KB
  • 文档页数:7

机器学习
∙机器学习的目的是把数据转换成信息。

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

人脸识别
∙人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。

∙每个节点的正确识别率很高,但正确拒绝率很低。

∙任一节点判断没有人脸特征则结束运算,宣布不是人脸。

∙全部节点通过,则宣布是人脸。

工业上,常用人脸识别技术来识别物体。

对图片进行识别
#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::vector<Rect> 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类
如果级联分类器检测到给定的位置中的一个对象,该函数返回1。

否则,它会返回已被否决的候选区域在哪个阶段的否定的指数。

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

代码注释:
//需要载入的级联分类器文件
该函数将输入图片从一个色彩空间转到另一个色彩空间。

当从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 );
直方图均衡化
∙直方图是图像中像素强度分布的图形表达方式。

∙它统计了每一个强度值所具有的像素个数。

∙直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。

∙说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是拉伸这个范围. 见下面
左图: 绿圈圈出了少有像素分布其上的强度值. 对其应用均衡化后,
得到了中间图所示的直方图. 均衡化的图像见下面右图.
直方图均衡函数使用了下列的算法:
1.计算源文件的直方图。

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

3.对直方图进行积分:
4.使用变换图片,其映射函数为:
该算法归一化亮度并增加了图像的对比度。