目录
人脸检索系统框架的构建 1
一.软件实现的主要界面 1
二.软件的需求概括 1
三.软件代码设计过程中需要注意的问题 2
四.程序到目前为止产生的诸多缺陷 4
五.程序的详细设计过程 4
1.输入部分的设计 4
2.检测结果部分的设计过程 10
人脸检索系统框架的构建
------FaceMFC_v1
一.软件实现的主要界面
软件的主要界面如图1.1所示,从程序的主界面可以看出整个系统主要由两大模块构成,包括:人脸的输入和检测模块,以及人脸识别和检索模块。按照组成部分可以将整个系统分成六个部分:包括:1.输入部分,2.检测结果,3.视频操作,4.信息配置,5.输出结果,6.软件简介。
图1.1 人脸检索系统主界面
二.软件的需求概括
软件主要的功能部分:
(1):能够打开读取任何BMP或者JPG图像,并将图像显示到固定空间上。(2):能够在控件上通过鼠标操作实现任意图像大小的剪裁,并实现剪裁后的图片显示。
(3):能够对任意一幅图像进行人脸检测,包括对图像剪裁之后,只对剪裁区域进行人脸检测。
(4):图像的重新加载,任何图像都与可能误操作,此时可以通过重新加载来实现数据恢复到原始的读入时的图像数据,包括实施剪裁的数据的清空。(5):图像信息的显示,主要是指一些简单的图像信息,包括图像的宽度、高度以及位深。
(6):人脸教案车结果的显示,就是将提供带检测的图像中人脸区域找出,并将其显示到指定的控件中,在此系统中并没有将全部检测到的人脸显示出来,不能动态显示(可以作为其缺钱在后面再叙述)。
(7):能够打开Xvid编码格式的avi视频文件,并获得视频文件的相关信息,并且通过制定控件查看,只包括简单的视频长度和宽度以及帧速率。
(8):能够实现简单的视频操作,包括视频在指定的控件上播放,能在暂停和播放模式之间切换.播放时能够显示相应的信息,包括总的视频时间长度,播放的动态时间显示,滑动条显示播放进度。
(9):人脸检索主要是对从视频中抓取的一帧图像进行人脸检测,并对其与检测输入选择的人脸进行识别,识别过程主要是计算所有人脸的欧式距离,默认距离最小值为识别的结果。
(10):可以进行检索之前的信息配置,本文转载自http://www.biyezuopin.vip/onews.asp?id=11024包括对视频检索步长的选取,以及检索时间段的选取。
(11):显示视频中最像待识别人脸的12个结果,每次显示六个结果,通过“上”“下”按键可以选择循环显示。
(12):能够对检测结果进行跟踪,即找出每个检索结果所在视频帧,以及相对应的时间,可以直接在原视频中查看原始图像。
(13):显示软件的相关介绍。
(14):所有显示图像的窗口都必须实现重绘的功能,就是在窗口最小化或被遮掩之后恢复之后原图的显示不会出现任何问题。
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
#define DEFAULT_CASCADE_NAME "C:\\Program Files\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"
#ifdef _EiC
#define WIN32
#endif
//int detect_and_draw( IplImage* image ,CvHaarClassifierCascade* cascade);
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
//static CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad ( DEFAULT_CASCADE_NAME, 0, 0, 0 );
//void detect_and_draw( IplImage* image );
const char* cascade_name ="../debug/haarcascade_frontalface_alt2.xml";
//cascade = (CvHaarClassifierCascade*)cvLoad (cascade_name, 0, 0, 0 );
/* "haarcascade_profileface.xml";*/
/*int detect_and_draw( IplImage* img,CvHaarClassifierCascade* cascade )
{
storage = cvCreateMemStorage(0);
//AfxMessageBox("hi,you!");
int scale = 1;
IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );
CvPoint pt1, pt2;
int i,N=0;
//cvPyrDown( img, temp, CV_GAUSSIAN_5x5 );
cvClearMemStorage( storage );
//cvEqualizeHist(small_img,small_img);
//AfxMessageBox("3");
//cvClearMemStorage( storage );
//AfxMessageBox("4");
if( cascade )
{
//AfxMessageBox("cascade Loaded!");
CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
cvSize(40, 40));
//AfxMessageBox("Wrong!");
N=faces ? faces->total:0;
for( i = 0; i < (faces ? faces->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
pt1.x = r->x*scale;
pt2.x = (r->x+r->width)*scale;
pt1.y = r->y*scale;
pt2.y = (r->y+r->height)*scale;
cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
}
}
else
{
AfxMessageBox(cascade_name);
}
cvNamedWindow("result",1);
cvShowImage( "result", img );
return N;
//cvDestroyWindow("result");
//AfxMessageBox("4");
//cvReleaseImage( &gray );
//cvReleaseImage( &small_img );
}*/
//把IplImage转化为CBitmap类型
HBITMAP Ipl2Bmp(IplImage *img)
{
HBITMAP hBitmap;
hBitmap=CreateBitmap(img->width, img->height,img->nChannels*8, 1, NULL);
SetBitmapBits(hBitmap, img->imageSize, img->imageData);
return hBitmap;
}