爆大奖娱乐平台

爆大奖娱乐平台""

深圳兴邦伟业电子有限公司
当前位置:爆大奖注册送56 > 技术文库 > 其他技术 >

Visual C++利用OpenCV对图像进行人脸识别(傻瓜教程)

人气:发表时间:2016-09-27 12:34

工程创建准备:

1. 安装Visual C++ 6.0或以上版本,本机安装Visual C++ 6.0

2. 安装OpenCV及配置

OpenCV 1.0在VC6下安装与配置

参考网站:

安装OpenCV

下载OpenCV安装程序。假如要将OpenCV安装到C:Program FilesOpenCV。在安装时选择"将OpenCVbin加入系统变量"(AddOpenCVbin to the systerm PATH)。


配置Windows环境变量

检查C:Program FilesOpenCVbin是否已经被加入到环境变量PATH,如果没有,请加入。

选择高级选项,然后选择“环境变量”,查看是否加入,如果没有则将其加入

加入后,在任务管理器里重启explorer.exe

配置Visual C++ 6.0

全局设置

菜单Tools(工具)->Options(选择)->Directories(目录):先设置lib路径,选择Library files,在下方填入路径:

C:Program FilesOpenCVlib

然后选择include files,在下方填入路径:

C:Program FilesOpenCVcxcoreinclude

C:Program FilesOpenCVcvinclude

C:Program FilesOpenCVcvauxinclude

C:Program FilesOpenCVmlinclude

C:Program FilesOpenCVotherlibshighgui

C:Program FilesOpenCVotherlibscvcaminclude


然后选择source files,在下方填入路径:

C:Program FilesOpenCVcvsrc

C:Program FilesOpenCVcxcoresrc

C:Program FilesOpenCVcvauxsrc

C:Program FilesOpenCVotherlibshighgui

C:Program FilesOpenCVotherlibscvcamsrcwindows

最后点击“ok”,完成设置。

在Visual C++ 6.0下创建使用OpenCV的VC Project

正常启动Visual C++ 6.0,并创建project。

项目设置

每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project(工程)->Settings(设置),然后将Setting for(设置)选为All Configurations(所有配置),然后选择右边的link(连接)标签,在Object/library modules(对象/库模块)附加上

cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib

如果你不需要这么多lib,你可以只添加你需要的lib。

创建以下win32 console application程序进行测试。

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

int main(int argc, char *argv[])

{

IplImage *img = cvLoadImage("lena.jpg");

cvNamedWindow("Image:", 1);

cvShowImage("Image:", img);

cvWaitKey();

cvDestroyWindow("Image:");

cvReleaseImage(&img);

return 0;

}

如果能够编译链接成功,则说明配置成功,否则检查前面的配置步骤。

开始创建工程

1, 打开Visual C++ 6.0,创建一个“Win32 Console Application”类型的工程,工程名称取“test”,单击“确定”,然后单击“完成”,结束应用程序创建。

2, 将…OpenCVdatahaarcascades目录下的数据文件haarcascade_frontalface_alt.xml复制到工程目录文件夹中。其中,…OpenCV为OpenCV的安装目录,数据文件haarcascade_frontalface_alt.xm为人脸检测时所用到得分类器。

3, 源程序代码如下:

/*test.cpp文件完整代码*/

#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 cascaden" );

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 中

// 引用任何所需的附加头文件,而不是在此文件中引用

4, 项目配置

每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上


cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib


如果你不需要这么多lib,你可以只添加你需要的lib。

5, 编译工程

在编译前,将要进行人脸检测的图片放到工程目录下,图片的名称要与代码中的名称对应。如:const char* filename = "景甜.jpg";//待检测图像(包含绝对路径)

一切准备就绪,编译并连接工程,运行生成的文件。效果如下:

欢迎大家加入我的QQ群