为了学习图像检测技术,把开源的OpenCV拿来研究,刚刚能用它监测人脸位置.
OpenCV的源码和安装包都在Sourceforge中可以搜到:
http://sourceforge.net/projects/opencvlibrary/files/
OpenCV用起来还是很简单的,根据readme把项目包配置好,三个方面:
而且还提供一套非常好用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检测图片,检测出来的基本上都是重要的边界,自己做的杂音太多了,没法拿出来.
FROM: http://blog.sina.com.cn/s/blog_73ee929c01010yo7.html