006_OPENCV--Opencv实现人脸实时监控(300元)
- 模板:¥300.00
- 成品编号:005+opencv006
- 使用技术:无
- 数据库:无
- 最后更新:2018-11-16 19:44
注意:QQ1764030875,qq1834660615为本网站唯一成品的账号,其他均为盗版
计算机毕业设计源码网:我们提供的源码通过邮箱或者QQ传送,如果有啥问题直接联系客服
素材描述:本设计内容包含:项目要求说明书+录像+源代码
论文(设计)题目 | 通过opencv实现人脸实时监控 |
软件环境 | Visual C++;opencv |
开发语言 | C++ |
硬件环境 | |
项目要求 |
根据现有的两个程序(一个可以对一副图片进行人脸识别的程序,一个可以启动电脑自身的摄像头,并把影像显示出来的程序),改成一个可以启动电脑自身摄像头,把人脸识别出来再显示图像,就是实时检测人脸,要验收的,所以程序得好使。。。 如果下面的程序您觉得读起来不舒服,您也可以按您的思路来 |
交付日期 | 2012.11.16 |
其他说明 |
两个已编译通过的程序如下: ①人脸识别的程序(编译准确无误) #include "stdafx.h" #include "cv.h" #include "highgui.h" #include <stdio.h> static CvHaarClassifierCascade* cascade = 0; static CvMemStorage* storage = 0; void detect_and_draw( IplImage* image ); const char* cascade_name="haarcascade_frontalface_alt.xml"; //人脸检测要用到的分类器 int _tmain(int argc, _TCHAR* argv[]) { cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); //加载人脸检测所用的分类器 if( !cascade ) { fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); return -1; } storage = cvCreateMemStorage(0); //动态存储结构,用来存储人脸在图像中的位置 cvNamedWindow( "result", 1 ); //const char* filename = "lena.jpg"; //待检测图像(包含绝对路径) const char* filename = "景甜.jpg"; IplImage* image = cvLoadImage( filename, 1 ); //加载图像 detect_and_draw( image ); //对加载的图像进行检测 cvWaitKey(0); cvReleaseImage( &image ); cvDestroyWindow("result"); return 0; } void detect_and_draw( IplImage* img ) { static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} }; double scale = 1.3; IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 ); IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale), cvRound (img->height/scale)), 8, 1 ); cvCvtColor( img, gray, CV_BGR2GRAY ); cvResize( gray, small_img, CV_INTER_LINEAR ); cvEqualizeHist( small_img, small_img ); cvClearMemStorage( storage ); if( cascade ) { /*函数cvHaarDetectObjects检测图像中的目标,由OpenCV提供。*/ CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0 , cvSize(30, 30) ); for( int i = 0; i < (faces ? faces->total : 0); i++ ) { CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); CvPoint center; int radius; center.x = cvRound((r->x + r->width*0.5)*scale); center.y = cvRound((r->y + r->height*0.5)*scale); radius = cvRound((r->width + r->height)*0.25*scale); cvCircle( img, center, radius, colors[i%8], 3, 8, 0 ); } } cvShowImage( "result", img ); cvReleaseImage( &gray ); cvReleaseImage( &small_img ); } /* stdafx.h文件完整代码*/ // stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 #pragma once #define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料 #include <stdio.h> #include <tchar.h> // TODO: 在此处引用程序需要的其他头文件 /* stdafx.cpp文件完整代码*/ // stdafx.cpp : 只包括标准包含文件的源文件 // FaceDetection.pch 将作为预编译头 // stdafx.obj 将包含预编译类型信息 #include "stdafx.h" // TODO: 在 STDAFX.H 中 // 引用任何所需的附加头文件,而不是在此文件中引用 ②获取摄像头,新建窗口显示摄像头视频的程序:(编译还有错误) 笔记本内置相机无法简单的使用opencv内部函数cvQueryFrame()来采集图像,网上查过资料之后,听说一般的摄像头,像外接相机采集视频支持的是VFW,那么就可以用OpenCV里面自带的函数进行采集,而我的笔记本内置摄像头采集卡支持的可能是directshow,那么只能采用Directshow的方法采集视频,具体方法如下: 1.事先需要下载相应DirectShow的源文件下载 2.把下载过来的源文件中的CameraDS.h CameraDS.cpp分别添加到目标工程中,并且把下载过来的DirectShow文件夹放入opencv根目录下 3.工具->选项->VC++目录下添加如下(假定装在D:\Program files):包含文件中D:\Program Files\OpenCV\DirectShow\Include;库文件中D:\Program Files\OpenCV\DirectShow\Lib 4.把CameraDS.h中#include "DirectShow/Include/qedit.h"和#include "DirectShow/Include/dshow.h"中的DirectShow/Include/去掉 主程序代码如下 int main(/*int argc,char** argv*/) { int cam_count; //仅仅获取相机数目 cam_count = CCameraDS::CameraCount(); printf("There are %d cameras.\n", cam_count); //获取所有相机的名称 for(int i=0; i < cam_count; i++) { char camera_name[1024]; int retval = CCameraDS::CameraName(i, camera_name, sizeof(camera_name)); if(retval >0) printf("Camera #%d's Name is '%s'.\n", i, camera_name); else printf("Can not get Camera #%d's name.\n", i); } if(cam_count==0) return -1; CCameraDS camera; //打开第一个相机 //if(! camera.OpenCamera(0, true)) //弹出属性选择窗口 if(! camera.OpenCamera(0, false, 640,480)) //不弹出属性选择窗口,用代码制定图像宽和高 { fprintf(stderr, "Can not open camera.\n"); return -1; } cvNamedWindow("camera"); while(1) { //获取一帧 IplImage *pFrame = camera.QueryFrame(); /*....视频处理代码....*/ //显示 cvShowImage("camera", pFrame); if (cvWaitKey(20) == 'q') break; } camera.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头 cvDestroyWindow("camera"); cvDestroyWindow("canny"); return 0; } |
标签
全部评论 / 0