您的位置:首页 > 运维架构

基于opencv的人脸识别:分别在1.0和2.4.3版本下的对比

2013-04-03 16:46 531 查看
先贴出一段代码,这是opencv1.0版本给出的sample,之前本人在vc6.0+opencv1.0的条件下做过实验,完全成功的。识别时间在50ms左右。

View Code

#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "iostream"
using namespace std;
using namespace cv;

void detectAndDisplay( Mat frame , CascadeClassifier face_cascade )
{
double scale=2.4;
extern TickMeter tm;
tm.reset();
std::vector<Rect> faces;
Mat frame_gray;
tm.start();
cvtColor( frame, frame_gray, CV_BGR2GRAY );
tm.stop();
cout<<"color convert time:"<<tm.getTimeMilli()<<"ms"<<endl;
tm.reset();
tm.start();
equalizeHist( frame_gray, frame_gray );
tm.stop();
cout<<"Hist time :"<<tm.getTimeMilli()<<"ms"<<endl;
tm.reset();
Mat small;
resize(frame_gray,small,Size(frame.cols/scale,frame.rows/scale));
tm.start();
face_cascade.detectMultiScale( small , faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30/scale, 30/scale) );
tm.stop();
cout<<"detect time"<<tm.getTimeMilli()<<"ms"<<endl;
for( int i = 0; i < faces.size(); i++ )
{
Point center( faces[i].x *scale+ faces[i].width*0.5, faces[i].y*scale + faces[i].height*0.5 );
ellipse( frame , center, Size( faces[i].width*0.5*scale, faces[i].height*0.5*scale), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8,  0);
}
imshow( "small", small );
imshow( "face_detect", frame );

}


  能够实现人脸的识别,但是有个严重的问题,那就是耗时太长,一张图片基本要1.8秒,完全达不到视频处理实时性的要求。即使用了金字塔降维之后,耗时依然十分严重。

  然后我觉得可能是新方法本身的算法本身的问题,于是用之前那段代码,也就是opencv1.0中的方法,在2.4.3下改了改,结果运行起来发现还是很慢,检测时间还是1秒多。也就是说,检测耗时长这个问题不是新的方法本身的问题,很可能是2.4.3版本结构上有不妥之处。

我在网上查了点资料,新的CascadeClassifier类不仅支持读入haar特征的训练文件(也就是.xml文件),而且支持lbp特征的训练文件(hog也支持)。于是在opncv安装目录下寻找,果然发现opencv/data目录下有个“lbpcascades”文件夹,里面装有lbp特征的训练文件,而opencv1.0版本的data目录系是仅有haar特征的训练文件的。然后我把代码中的训练文件改为lbp特征的训练文件,发现检测速度可以达到50ms每张,基本能满足实时性了。

  

  以上就是在使用opencv的过程中的一点经验和心得,希望有更多比较精通cv理论的园友一起讨论交流,2.4.3版本的haar特征检测耗时问题也是一直迷惑着我,希望有高人能够点拨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: