为了学习图像检测技术,把开源的OpenCV拿来研究,刚刚能用它监测人脸位置.
OpenCV的源码和安装包都在Sourceforge中可以搜到:
http://sourceforge.net/projects/opencvlibrary/files/
OpenCV用起来还是很简单的,根据readme把项目包配置好,三个方面:
1,dll库路径设好环境变量,2,头文件路径设好,3,静态库文件路径设好,就可以调用函数,
而且还提供一套非常好用GUI,用起来跟Matlab差不多.
下面贴出用C++实现的人脸跟踪程序
#include "cv.h" #include "highgui.h" int main() { //读取摄像头 //声明IplImage指针 IplImage* pFrame = NULL; CvCapture* pCapture = NULL; IplImage* pgray=NULL; IplImage* pcanny; CvMemStorage* storage=0; //cascade 这个是和人脸检测很有关系的, //我猜它可能用了一个神经网络之类的,从一个文件中读取一个 //已经训练好的神经网络,天!自己怎么实现啊! CvHaarClassifierCascade* cascade=0; char cascadename[100]="C:\\OpenCV2.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"; cascade = (CvHaarClassifierCascade*)cvLoad(cascadename,0,0,0); storage = cvCreateMemStorage(0); CvSeq* faces; //创建窗口//就这么一句就创建了一个窗口,比Windows Api简单点 //窗口通过窗口名来标识 cvNamedWindow("video", 1); //cvMoveWindow("video", 30, 0); //打开摄像头或视频流 ,OpenCV居然还支持Real.嗨!什么都让别人做了 pCapture = cvCaptureFromCAM(-1); //pCapture = cvCaptureFromFile("E:\\电影\\战争\\卓别林第一部有声喜剧片大独裁者RMVB中文字幕.rm"); //每次循环从摄像头中读取一帧图片,我用的USB摄像机,条件不太好哦 bool first=true; while(pFrame = cvQueryFrame( pCapture )) { if(first)//初次循环,做些初始化 { first=false; //创建单通道图片 pgray=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1); //这是canny边缘监测,和我原来做的差分得边缘不是一个级别的 pcanny=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1); } //将彩色图转化为2值图 cvCvtColor(pFrame,pgray,CV_BGR2GRAY); cvCanny(pgray,pcanny,30,100,3); //canny边缘检测 /*********************************/ //检测人脸, faces = cvHaarDetectObjects(pgray,cascade, storage,1.1,2,0 ,cvSize(30,30)); for(short i=0;i<(faces?faces->total:0);i++) { //得到人脸的区域 CvRect* rect = (CvRect*)cvGetSeqElem(faces,i); //在人脸区域画个圆圈 CvPoint center; //中心 center.x=rect->x+rect->width/2; center.y=rect->y+rect->height/2; short radius = sqrt(pow(rect->width,2)//半径 +pow(rect->height,2))/2; CvScalar color={{255,0,0}}; //画圈的颜色 cvCircle(pFrame,center,radius,color,3,8,0); /**********************************/ } //显示图像 //cvShowImage("video", pcanny); cvShowImage("video", pFrame); //延时 ,不然不会显示图像的,应该是扫描太快了 if(cvWaitKey(10)>= 0) { break; } } //释放图像 cvReleaseImage(&pFrame); cvReleaseImage(&pgray); cvReleaseImage(&pcanny); //销毁窗口 cvDestroyWindow("video"); //释放摄像设备 cvReleaseCapture(&pCapture); return 0; }人脸检测图片:相机不太好,还是能检测到的
下面是canny检测图片,检测出来的基本上都是重要的边界,自己做的杂音太多了,没法拿出来.