首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

opencv 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸,每个节点的正确识别率很高,但正确拒绝率很低,任一节点判断没有人脸特征则结束运算,宣布不是人脸
机器学习
机器学习的目的是把数据转换成信息。
机器学习通过从数据里提取规则或模式来把数据转成信息。
人脸识别
人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。
每个节点的正确识别率很高,但正确拒绝率很低。
任一节点判断没有人脸特征则结束运算,宣布不是人脸。
全部节点通过,则宣布是人脸。
工业上,常用人脸识别技术来识别物体。
对图片进行识别
复制代码 代码如下:
#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
用于检测物体的级联分类器类。
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, 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() 设置图像的检测工作。
继承事业,薪火相传
返回列表