机器学习 html
人脸识别 node
工业上,经常使用人脸识别技术来识别物体。 ios
对图片进行识别 算法
#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类 函数
class CascadeClassifier 学习
用于检测物体的级联分类器类。 ui
CascadeClassifier::CascadeClassifier
从一个文件读取分类器。 lua
C++: CascadeClassifier::CascadeClassifier(const string& filename)
参数 filename – 所要读取分类器文件的文件名 CascadeClassifier::empty
检查分类器是否已经载入。 spa
C++: bool CascadeClassifier::empty() constCascadeClassifier::load
从一个文件读取分类器。
C++: bool CascadeClassifier::load(const string& filename)
参数 filename – 所要读取分类器文件的文件名。文件能够是旧版的HAAR分类器模型也能够是新版的分类器模型。 CascadeClassifier::read
读取一个文件存储节点的分类器。
C++: bool CascadeClassifier::read(const FileNode& node)
CascadeClassifier::detectMultiScale
对不一样大小的输入图像进行物体识别,并返回一个识别到的物体的矩阵列表。
C++: void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& 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(Ptr<FeatureEvaluator>& feval, const Mat& image)
参数
- feval – 用于特征计算的特征求值程序的指针。
- image – 须要进行特征检测的 CV_8U 输入矩阵。
这个函数将在每张图片中被 CascadeClassifier::detectMultiScale() 自动调用。 但若是你想在不一样位置手动使用 CascadeClassifier::runAt(),你须要先调用该函数,使得图像被积分计算。
CascadeClassifier::runAt
在指定点运行检测。
C++: int CascadeClassifier::runAt(Ptr<FeatureEvaluator>& feval, Point pt, double& weight)
参数 feval – 用于特征计算的特征求值程序。
pt – 指定检测窗口左上角的点。窗口的大小和检测的图片大小一致。
若是级联分类器检测到给定的位置中的一个对象,该函数返回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 );
直方图均衡化
咱们利用直方图均衡化对图片加强对比度,方便级联分类器分析。
equalizeHist API:
对灰度图像进行直方图均衡。
C++: void equalizeHist(InputArray src, OutputArray dst)
参数
- src – 源为8位单通道图像。
- dst – 输出图像,和源图片一样大小类型。
直方图均衡函数使用了下列的算法:
计算源文件的直方图
。
调整直方图,使得其方格总个数为255。
对直方图进行积分:
![]()
使用
变换图片,其映射函数为:
。
该算法归一化亮度并增长了图像的对比度。
被山寨的原文
Cascade Classifier . OpenCV.org
Cascade Classification API . OpenCV.org
Histogram Equalization . OpenCV.org