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
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
相关文章推荐
- Apache OpenMeetings 会议系统getshell初探 - 2016-04-28 16:48
- Linux Shell 04 数字/字符串/文件测试
- Tomcat性能调优
- 【Linux学习笔记四】磁盘管理中文件压缩与解压
- linux下如何查找函数所在的库文件
- openfire服务器的使用
- Centos 7 使用Ecplise开发Android出现 error while loading shared libraries: libz.so.1 的问题
- Centos 6.4 python 2.6 升级到 2.7
- Apache服务器搭建
- linux 隔文件夹建立软链接
- Linux下搭建Nginx+heartbeat
- linux设备驱动开发——异步通知
- Hadoop搭建
- Shell编程基础
- linux常用服务-vsftpd登陆错误
- 软考高项学员:2016年4月13日作业
- Tomcat内存设置详解
- php+nginx 上传大文件要修改的配置
- 编译OpenBLAS
- Linux 下IO端口编程访问