006_OPENCV--Opencv实现人脸实时监控(300元)

  • 模板:¥300.00
  • 成品编号:005+opencv006
  • 使用技术:
  • 数据库:
  • 最后更新:2018-11-16 19:44

注意:QQ1764030875,qq1834660615为本网站唯一成品的账号,其他均为盗版

006_OPENCV--Opencv实现人脸实时监控(300元)的大图展示

计算机毕业设计源码网:我们提供的源码通过邮箱或者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

    相关推荐

    收缩