2 程序开发
人脸检测是一个非常先进的问题,它是人脸研究的一个主要方向,其任务是对于一幅给定的图像,采用一定的策略对其进行搜索,以确定其中是否含有人脸、含有多少个人脸,以及所含人脸的位置、大小和姿态。人脸检测的算法很多,Adaboost算法是其中的一种。Adaboost算法虽然十分复杂,但应用OpenCV提供的函数和分类器进行人脸检测将是十分容易。
2.1 利用OpenCV进行人脸检测
人脸检测程序主要完成3部分功能,即加载分类器、加载待检测图像以及检测并标示。本程序使用OpenCV中提供的“haarcascade_frontalface_alt.xml”文件存储的目标检测分类,用cvLoad函数载入后,进行强制类型转换。OpenCV中提供的用于检测图像中目标的函数是cvHaarDetectObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图像中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回。分类器在使用后需要被显式释放,所用的函数为cvReleaseHaarClassifierCascade,这些函数原型请参看有关OpenCV手册。
2.2程序实现
(1)新建一个Visual C++ MFC项目,取名为“FaceDetection”,选择应用程序类型为“单文档”。将菜单中多余的项去掉,并添加一项“人脸检测”,其ID为“ID_FaceDetected”,并生成该菜单项的消息映射函数。
(2)在“FaceDetectionView.h”头文件中添加以下灰底色部分程序代码:
//南京森林公安高等专科学校 江林升
// FaceDetectionView.h : CFaceDetectionView 类的接口
#pragma once
#include "cv.h"
#include "highgui.h"
class CFaceDetectionView : public CView
{
protected: // 仅从序列化创建
CFaceDetectionView();
DECLARE_DYNCREATE(CFaceDetectionView)
// 属性
public:
CFaceDetectionDoc* GetDocument() const;
CvHaarClassifierCascade* cascade;//特征器分类
CvMemStorage* storage;
void detect_and_draw( IplImage* img );
IplImage* src; //载入的图像
|