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

OpenCV人脸跟踪canny边缘检测

2016-04-28 22:36 441 查看
为了学习图像检测技术,把开源的OpenCV拿来研究,刚刚能用它监测人脸位置.

OpenCV的源码和安装包都在Sourceforge中可以搜到:
http://sourceforge.net/projects/opencvlibrary/files/
OpenCV用起来还是很简单的,根据readme把项目包配置好,三个方面:

1,dll库路径设好环境变量,2,头文件路径设好,3,静态库文件路径设好,就可以调用函数,

而且还提供一套非常好用GUI,用起来跟Matlab差不多.

下面贴出用C++实现的人脸跟踪程序

Cpp代码




#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: