快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡萄app下载_龟发之家论坛



机械进修

机械进修的目的是把数据转换成信息。

机械进修经由过程从数据里提取规则或模式来把数据转成信息。

人脸识别

人脸识别经由过程级联分类器对特性的分级筛选来确定是否是人脸。

每个节点的精确识别率很高,但精确回绝率很低。

任一节点判断没有人脸特性则停止运算,发布不是人脸。

整个节点经由过程,则发布是人脸。

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

对图片进行识别

#include "opencv2/core/core.hpp"

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

#include "opencv2/imgproc/imgproc.hpp"

#include#include

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 faces;Mat frame_gray;

cvtColor( frame, frame_gray, CV_BGR2G澳门新葡萄app下载RAY );

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; iPoint 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 – 所要读取分类器文件的文件名

CascadeClassifier::empty

反省分类器是否已经载入。

C+澳门新葡萄app下载+: bool CascadeClassifier::empty() const

CascadeClassifier::load

从一个文件读取分类器。

C++: bool CascadeClassifier::load(const string& filename)

参数

filename – 所要读取分类器文件的文件名。文件可所以旧版的HAAR分类器模型也可所以新版的分类器模型。

CascadeClassifier::read

读取一个文件存储节点的分类器。

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

CascadeClassifier::detectMultiScale

对不合大年夜小的输入图像进行物体识别,并返回一个识别到的物体的矩阵列表。

& objects, double scaleFactor, int minNeighbors, int flags, Size minSize, Size maxSize)">C++: void CascadeClassifier::detectMultiScale(const Mat& image, vector& 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

设置被用于检测的图像。

& feval, const Mat& image)">C++: bool CascadeClassifier::setImage(Ptr& feval, const Mat& image)

参数

feval – 用于特性谋略的特性求值法度榜样的指针。

image – 必要进行特性检测的 CV_8U 输入矩阵。

这个函数将在每张图片中被 CascadeClassifier::detectMultiScale() 自动调用。 但假如你想在不合位置手动应用 CascadeClassifier::run澳门新葡萄app下载At(),你必要先调用该函数,使得图像被积分谋略。

CascadeClassifier::runAt

在指定点运行检测。

& feval, Point pt, double& weight)">C++: int CascadeClassifier::runAt(Ptr& feval, Point pt, double& weight)

参数

feval – 用于特性谋略的特性求值法度榜样。

pt – 指定检测窗口左上角的点。窗口的大年夜小和检测的图片大年夜小同等。

假如级联分类器检测到给定的位置中的一个工具,该函数返回1。否则,它会返回已被反对的候选区域在哪个阶段的否定的指数。

应用CascadeClassifier::setImage() 设置图像的检测事情。

代码注释:

//必要载入的级联分类器文件

string face_cascade_name = "haarcascade_frontalface_alt.xml"; //级联分类器类

CascadeClassifier face_cascade;

//……

//载入级联分类器,并判断是否载入成功,假如不成功则打印提示if( !澳门新葡萄app下载face_cascade.load( face_cascade_name ) ){

printf("[error] 无法加载级联分类器文件!\n");return -1;

}

//……

//对图片frame进行识别检测face_cascad澳门新葡萄app下载e.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 );

您可能还会对下面的文章感兴趣: