搜档网
当前位置:搜档网 › 人脸检测的代码分析

人脸检测的代码分析

人脸检测的代码分析
人脸检测的代码分析

OpenCV学习笔记(三)人脸检测的代码分析

一、预备知识:

1、动态内存存储及操作函数

CvMemStorage

typedef struct CvMemStorage

{

struct CvMemBlock* bottom;/* first allocated block */

struct CvMemBlock* top; /* the current memory block - top of the stack */

struct CvMemStorage* parent; /* borrows new blocks from */

int block_size; /* block size */

int free_space; /* free space in the top block (in bytes) */

} CvMemStorage;

内存存储器是一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块构成,呈列表型---bottom 域指的是列首,top 域指的是当前指向的块但未必是列尾.在bottom和top之间所有的块(包括bottom, 不包括top)被完全占据了空间;在top和列尾之间所有的块(包括块尾,不包括top)则是空的;而top 块本身则被占据了部分空间-- free_space 指的是top块剩余的空字节数。新分配的内存缓冲区(或显示的通过cvMemStorageAlloc 函数分配,或隐示的通过cvSeqPush, cvGraphAddEdge等高级函数分配)总是起始于当前块(即top块)的剩余那部分,如果剩余那部分能满足要求(够分配的大小)。分配后,free_space 就减少了新分配的那部分内存大小,外加一些用来保存适当列型的附加大小。当top块的剩余空间无法满足被分配的块(缓冲区)大小时,top块的下一个存储块被置为当前块(新的top块)-- free_space 被置为先前分配的整个块的大小。如果已经不存在空的存储块(即:top块已是列尾),则必须再分配一个新的块(或从parent那继承,见cvCreateChildMemStorage)并将该块加到列尾上去。于是,存储器(memory storage)就如同栈(Stack)那样, bottom指向栈底,(top, free_space)对指向栈顶。栈顶可通过cvSaveMemStoragePos保存,通过cvRestoreMemStoragePos 恢复指向,通过cvClearStorage 重置。

CvMemBlock

内存存储块结构

typedef struct CvMemBlock

{

struct CvMemBlock* prev;

struct CvMemBlock* next;

} CvMemBlock;

CvMemBlock 代表一个单独的内存存储块结构。内存存储块中的实际数据存储在header 块之后(即:存在一个头指针head 指向的块header ,该块不存储数据),于是,内存块的第i 个字节可以通过表达式((char*)(mem_block_ptr+1))[i] 获得。然而,通常没必要直接去获得存储结构的域。

CvMemStoragePos

内存存储块地址

typedef struct CvMemStoragePos

{

CvMemBlock* top;

int free_space;

} CvMemStoragePos;

该结构(如以下所说)保存栈顶的地址,栈顶可以通过cvSaveMemStoragePos 保存,也可以通过cvRestoreMemStoragePos 恢复。

cvCreateMemStorage

创建内存块

CvMemStorage* cvCreateMemStorage( int block_size=0 );

block_size:存储块的大小以字节表示。如果大小是0 byte, 则将该块设置成默认值当前默认大小为64k.

函数cvCreateMemStorage 创建一内存块并返回指向块首的指针。起初,存储块是空的。头部(即:header)的所有域值都为0,除了block_size 外.

cvCreateChildMemStorage

创建子内存块

CvMemStorage* cvCreateChildMemStorage( CvMemStorage* parent );

parent 父内存块

函数cvCreateChildMemStorage 创建一类似于普通内存块的子内存块,除了内存分配/释放机制不同外。当一个子存储块需要一个新的块加入时,它就试图从parent 那得到这样一个块。如果parent 中还未被占据空间的那些块中的第一个块是可获得的,就获取第一个块(依此类推),再将该块从parent 那里去除。如果不存在这样的块,则parent 要么分配一个,要么从它自己parent (即:parent 的parent) 那借个过来。换句话说,完全有可能形成一个链或更为复杂的结构,其中的内存存储块互为child/ parent 关系(父子关系)。当子存储结构被释放或清除,它就把所有的块还给各自的parent. 在其他方面,子存储结构同普通存储结构一样。

子存储结构在下列情况中是非常有用的。想象一下,如果用户需要处理存储在某个块中的动态数据,再将处理的结果存放在该块中。在使用了最简单的方法处理后,临时数据作为输入和输出数据被存放在了同一个存储块中,于是该存储块看上去就类似下面处理后的样子:Dynamic data processing without using child storage. 结果,在存储块中,出现了垃圾(临时数据)。然而,如果在开始处理数据前就先建立一个子存储块,将临时数据写入子存储块中并在最后释放子存储块,那么最终在源/目的存储块(source / destination storage) 中就不会出现垃圾, 于是该存储块看上去应该是如下形式:Dynamic data processing using a child storage. cvReleaseMemStorage

释放内存块

void cvReleaseMemStorage( CvMemStorage** storage );

storage: 指向被释放了的存储块的指针

函数cvReleaseMemStorage 释放所有的存储(内存)块或者将它们返回给各自的parent (如果需要的话)。接下来再释放header块(即:释放头指针head 指向的块= free(head))并清除指向该块的指针(即:head = NULL)。在释放作为parent 的块之前,先清除各自的child 块。

cvClearMemStorage

清空内存存储块

void cvClearMemStorage( CvMemStorage* storage );

storage:存储存储块

函数cvClearMemStorage 将存储块的top 置到存储块的头部(注:清空存储块中的存储内容)。该函数并不释放内存(仅清空内存)。假使该内存块有一个父内存块(即:存在一内存块与其有父子关系),则函数就将所有的块返回给其parent.

cvMemStorageAlloc

在存储块中分配以内存缓冲区

void* cvMemStorageAlloc( CvMemStorage* storage, size_t size );

storage:内存块.

size:缓冲区的大小.

函数cvMemStorageAlloc 在存储块中分配一内存缓冲区。该缓冲区的大小不能超过内存块的大小,否则就会导致运行时错误。缓冲区的地址被调整为CV_STRUCT_ALIGN 字节(当前为sizeof(double)).

cvMemStorageAllocString

在存储块中分配一文本字符串

typedef struct CvString

{

int len;

char* ptr;

}

CvString;

CvString cvMemStorageAllocString( CvMemStorage* storage, const char* ptr, int len=-1 ); storage:存储块

ptr:字符串

len:字符串的长度(不计算'\0')。如果参数为负数,函数就计算该字符串的长度。

函数cvMemStorageAlloString 在存储块中创建了一字符串的拷贝。它返回一结构,该结构包含字符串的长度(该长度或通过用户传递,或通过计算得到)和指向被拷贝了的字符串的指针。

cvSaveMemStoragePos

保存内存块的位置(地址)

void cvSaveMemStoragePos( const CvMemStorage* storage, CvMemStoragePos* pos ); storage:内存块.

pos:内存块顶部位置。

函数cvSaveMemStoragePos 将存储块的当前位置保存到参数pos 中。函数cvRestoreMemStoragePos 可进一步获取该位置(地址)。

cvRestoreMemStoragePos

恢复内存存储块的位置

void cvRestoreMemStoragePos( CvMemStorage* storage, CvMemStoragePos* pos ); storage:内存块.

pos:新的存储块的位置

函数cvRestoreMemStoragePos 通过参数pos 恢复内存块的位置。该函数和函数cvClearMemStorage 是释放被占用内存块的唯一方法。注意:没有什么方法可去释放存储块

中被占用的部分内存。

2、分类器结构及操作函数:

CvHaarFeature

#define CV_HAAR_FEATURE_MAX 3

typedef struct CvHaarFeature

{

int tilted;

struct

{

CvRect r;

float weight;

} rect[CV_HAAR_FEATURE_MAX];

}

CvHaarFeature;

一个harr 特征由2-3 个具有相应权重的矩形组成

titled :/* 0 means up-right feature, 1 means 45--rotated feature */

rect[CV_HAAR_FEATURE_MAX]; /* 2-3 rectangles with weights of opposite signs and with absolute values inversely proportional to the areas of the rectangles. if rect[2].weight !=0, then the feature consists of 3 rectangles, otherwise it consists of 2 */

CvHaarClassifier

typedef struct CvHaarClassifier

{

int count;

CvHaarFeature* haar_feature;

float* threshold;

int* left;

int* right;

float* alpha;

}

CvHaarClassifier;

/* a single tree classifier (stump in the simplest case) that returns the response for the feature at the particular image location (i.e. pixel sum over subrectangles of the window) and gives out a value depending on the responce */

int count; /* number of nodes in the decision tree */

/* these are "parallel" arrays. Every index i corresponds to a node of the decision tree (root has 0-th index).

left[i] - index of the left child (or negated index if the left child is a leaf)

right[i] - index of the right child (or negated index if the right child is a leaf)

threshold[i] - branch threshold. if feature responce is <= threshold, left branch is chosen, otherwise right branch is chosed.

alpha[i] - output value correponding to the leaf. */

CvHaarStageClassifier

typedef struct CvHaarStageClassifier

{

int count; /* number of classifiers in the battery */

float threshold; /* threshold for the boosted classifier */

CvHaarClassifier* classifier; /* array of classifiers */

/* these fields are used for organizing trees of stage classifiers,

rather than just stright cascades */

int next;

int child;

int parent;

}

CvHaarStageClassifier;

/* a boosted battery of classifiers(=stage classifier): the stage classifier returns 1 if the sum of the classifiers' responces is greater than threshold and 0 otherwise */

int count; /* number of classifiers in the battery */

float threshold; /* threshold for the boosted classifier */

CvHaarClassifier* classifier; /* array of classifiers */

/* these fields are used for organizing trees of stage classifiers, rather than just stright cascades */ CvHaarClassifierCascade

typedef struct CvHidHaarClassifierCascade CvHidHaarClassifierCascade;

typedef struct CvHaarClassifierCascade

{

int flags;

int count;

CvSize orig_window_size;

CvSize real_window_size;

double scale;

CvHaarStageClassifier* stage_classifier;

CvHidHaarClassifierCascade* hid_cascade;

}

CvHaarClassifierCascade;

/* cascade or tree of stage classifiers */

int flags; /* signature */

int count; /* number of stages */

CvSize orig_window_size; /* original object size (the cascade is trained for) */

/* these two parameters are set by cvSetImagesForHaarClassifierCascade */

CvSize real_window_size; /* current object size */

double scale; /* current scale */

CvHaarStageClassifier* stage_classifier; /* array of stage classifiers */ CvHidHaarClassifierCascade* hid_cascade; /* hidden optimized representation of the cascade, created by cvSetImagesForHaarClassifierCascade */

所有的结构都代表一个级联boosted Haar分类器。级联有下面的等级结构:Cascade:

Stage1:

Classifier11:

Feature11

Classifier12:

Feature12

...

Stage2:

Classifier21:

Feature21

...

...

整个等级可以手工构建,也可以利用函数cvLoadHaarClassifierCascade从已有的磁盘文件或嵌入式基中导入。

特征检测用到的函数:

cvLoadHaarClassifierCascade

从文件中装载训练好的级联分类器或者从OpenCV中嵌入的分类器数据库中导入CvHaarClassifierCascade* cvLoadHaarClassifierCascade(

const char* directory,

CvSize orig_window_size );

directory :训练好的级联分类器的路径

orig_window_size:级联分类器训练中采用的检测目标的尺寸。因为这个信息没有在级联分类器中存储,所有要单独指出。

函数cvLoadHaarClassifierCascade 用于从文件中装载训练好的利用海尔特征的级联分类器,或者从OpenCV中嵌入的分类器数据库中导入。分类器的训练可以应用函数haartraining(详细察看opencv/apps/haartraining)

函数已经过时了。现在的目标检测分类器通常存储在XML 或YAML 文件中,而不是通过路径导入。从文件中导入分类器,可以使用函数cvLoad 。cvReleaseHaarClassifierCascade

释放haar classifier cascade。

void cvReleaseHaarClassifierCascade( CvHaarClassifierCascade** cascade );

cascade :双指针类型指针指向要释放的cascade. 指针由函数声明。

函数cvReleaseHaarClassifierCascade 释放cascade的动态内存,其中cascade的动态内存或者是手工创建,或者通过函数cvLoadHaarClassifierCascade 或cvLoad分配。cvHaarDetectObjects

检测图像中的目标

typedef struct CvAvgComp

{

CvRect rect; /* bounding rectangle for the object (average rectangle of a group) */

int neighbors; /* number of neighbor rectangles in the group */

}

CvAvgComp;

CvSeq* cvHaarDetectObjects( const CvArr* image,

CvHaarClassifierCascade* cascade,

CvMemStorage* storage,

double scale_factor=1.1,

int min_neighbors=3, int flags=0,

CvSize min_size=cvSize(0,0) );

image 被检图像

cascade harr 分类器级联的内部标识形式

storage 用来存储检测到的一序列候选目标矩形框的内存区域。

scale_factor 在前后两次相继的扫描中,搜索窗口的比例系数。例如1.1指将搜索窗口依次扩大10%。

min_neighbors 构成检测目标的相邻矩形的最小个数(缺省-1)。如果组成检测目标的小矩形的个数和小于min_neighbors-1 都会被排除。如果min_neighbors 为0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。

flags 操作方式。当前唯一可以定义的操作方式是CV_HAAR_DO_CANNY_PRUNING。如果被设定,函数利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域,因为这样的区域一般不含被检目标。人脸检测中通过设定阈值使用了这种方法,并因此提高了检测速度。

min_size 检测窗口的最小尺寸。缺省的情况下被设为分类器训练时采用的样本尺寸(人脸检测中缺省大小是~20×20)。

函数cvHaarDetectObjects 使用针对某目标物体训练的级联分类器在图像中找到包含目标物体的矩形区域,并且将这些区域作为一序列的矩形框返回。函数以不同比例大小的扫描窗口对图像进行几次搜索(察看cvSetImagesForHaarClassifierCascade)。每次都要对图像中的这些重叠区域利用cvRunHaarClassifierCascade进行检测。有时候也会利用某些继承(heuristics)技术以减少分析的候选区域,例如利用Canny 裁减(prunning)方法。函数在处理和收集到候选的方框(全部通过级联分类器各层的区域)之后,接着对这些区域进行组合并且返回一系列各个足够大的组合中的平均矩形。调节程序中的缺省参数(scale_factor=1.1, min_neighbors=3, flags=0)用于对目标进行更精确同时也是耗时较长的进一步检测。为了能对视频图像进行更快的实时检测,参数设置通常是:scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING, min_size= (例如, 对于视频会议的图像区域).

cvSetImagesForHaarClassifierCascade

为隐藏的cascade(hidden cascade)指定图像

void cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade,

const CvArr* sum, const CvArr* sqsum,

const CvArr* tilted_sum, double scale ); cascade 隐藏Harr 分类器级联(Hidden Haar classifier cascade), 由函数cvCreateHidHaarClassifierCascade生成

sum 32-比特,单通道图像的积分图像(Integral (sum) 单通道image of 32-比特integer format). 这幅图像以及随后的两幅用于对快速特征的评价和亮度/对比度的归一化。它们都可以利用函数cvIntegral从8-比特或浮点数单通道的输入图像中得到。

sqsum 单通道64比特图像的平方和图像

tilted_sum 单通道32比特整数格式的图像的倾斜和(Tilted sum)

scale cascade的窗口比例. 如果scale=1, 就只用原始窗口尺寸检测(只检测同样尺寸大小的目标物体) - 原始窗口尺寸在函数cvLoadHaarClassifierCascade中定义(在""中缺省为24x24), 如果scale=2, 使用的窗口是上面的两倍(在face

cascade中缺省值是48x48 )。这样尽管可以将检测速度提高四倍,但同时尺寸小于48x48的人脸将不能被检测到。

函数cvSetImagesForHaarClassifierCascade 为hidden classifier cascade 指定图像and/or 窗口比例系数。如果图像指针为空,会继续使用原来的图像(i.e. NULLs 意味这"不改变图像")。比例系数没有"protection" 值,但是原来的值可以通过函数cvGetHaarClassifierCascadeScale 重新得到并使用。这个函数用于对特定图像中检测特定目标尺寸的cascade分类器的设定。函数通过cvHaarDetectObjects进行内部调用,但当需要在更低一层的函数cvRunHaarClassifierCascade中使用的时候,用户也可以自行调用。cvRunHaarClassifierCascade

在给定位置的图像中运行cascade of boosted classifier

int cvRunHaarClassifierCascade( CvHaarClassifierCascade* cascade,

CvPoint pt, int start_stage=0 );

cascade Haar 级联分类器

pt 待检测区域的左上角坐标。待检测区域大小为原始窗口尺寸乘以当前设定的比例系数。当前窗口尺寸可以通过cvGetHaarClassifierCascadeWindowSize重新得到。

start_stage 级联层的初始下标值(从0开始计数)。函数假定前面所有每层的分类器都已通过。这个特征通过函数cvHaarDetectObjects内部调用,用于更好的处理器高速缓冲存储器。函数cvRunHaarHaarClassifierCascade 用于对单幅图片的检测。在函数调用前首先利用cvSetImagesForHaarClassifierCascade设定积分图和合适的比例系数(=> 窗口尺寸)。当分析的矩形框全部通过级联分类器每一层的时返回正值(这是一个候选目标),否则返回0或负值。

二、例程分析:

例子:利用级联的Haar classifiers寻找检测目标(e.g. faces).

#include "cv.h"

#include "highgui.h"

//读取训练好的分类器。

CvHaarClassifierCascade* load_object_detector( const char* cascade_path )

{

return (CvHaarClassifierCascade*)cvLoad( cascade_path );

}

void detect_and_draw_objects( IplImage* image,

CvHaarClassifierCascade* cascade,

int do_pyramids )

{

IplImage* small_image = image;

CvMemStorage* storage = cvCreateMemStorage(0); //创建动态内存

CvSeq* faces;

int i, scale = 1;

/* if the flag is specified, down-scale the 输入图像to get a

performance boost w/o loosing quality (perhaps) */

if( do_pyramids )

{

small_image = cvCreateImage( cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3 );

cvPyrDown( image, small_image, CV_GAUSSIAN_5x5 );//函数cvPyrDown 使用Gaussian 金字塔分解对输入图像向下采样。首先它对输入图像用指定滤波器进行卷积,然后通过拒绝偶数的行与列来下采样图像。

scale = 2;

}

/* use the fastest variant */

faces = cvHaarDetectObjects( small_image, cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING );

/* draw all the rectangles */

for( i = 0; i < faces->total; i++ )

{

/* extract the rectanlges only */

CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i, 0 );

cvRectangle( image, cvPoint(face_rect.x*scale,face_rect.y*scale),

cvPoint((face_rect.x+face_rect.width)*scale,

(face_rect.y+face_rect.height)*scale),

CV_RGB(255,0,0), 3 );

}

if( small_image != image )

cvReleaseImage( &small_image );

cvReleaseMemStorage( &storage ); //释放动态内存

}

/* takes image filename and cascade path from the command line */

int main( int argc, char** argv )

{

IplImage* image;

if( argc==3 && (image = cvLoadImage( argv[1], 1 )) != 0 )

{

CvHaarClassifierCascade* cascade = load_object_detector(argv[2]);

detect_and_draw_objects( image, cascade, 1 );

cvNamedWindow( "test", 0 );

cvShowImage( "test", image );

cvWaitKey(0);

cvReleaseHaarClassifierCascade( &cascade );

cvReleaseImage( &image );

}

return 0;

}

关键代码很简单,装载分类器,对输入图像进行金字塔采样,然后用cv的函数进行检测目标,最后输出检测到的目标矩形。

基于matlab的人脸识别源代码

function varargout = FR_Processed_histogram(varargin) %这种算法是基于直方图处理的方法 %The histogram of image is calculated and then bin formation is done on the %basis of mean of successive graylevels frequencies. The training is done on odd images of 40 subjects (200 images out of 400 images) %The results of the implemented algorithm is 99.75 (recognition fails on image number 4 of subject 17) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @FR_Processed_histogram_OpeningFcn.,.. 'gui_OutputFcn', @FR_Processed_histogram_OutputFcn.,.. 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

基于VC++的人脸识别系统的设计与实现含源程序

目录 摘要............................................................. III 第1章绪论 (1) 1.1引言 (1) 1.2国内外研究现状与人脸识别的发展阶段 (2) 1.3人脸识别的研究内容 (3) 1.4相关学科 (4) 1.5小结 (5) 第2章人脸检测技术研究 (6) 2.1人脸检测问题分类 (6) 2.2人脸模式特征提取法[11] (8) 2.2.1肤色特征 (8) 2.2.2 灰度特征[12] (8) 2.3人脸检测方法分类 (9) 2.3.1 基于知识的方法 (10) 2.3.2 基于统计模型的人脸检测方法 (11) 2.3.3 基于模板的方法[19] (15) 2.4小结 (16) 第3章基于隐马尔可夫模型HMM的人脸识别 (17) 3.1相关背景概念 (17) 3.2隐马尔可夫模型HMM构成元素[16] (18) 3.3隐马尔可夫模型HMM原理 (19) 3.4隐马尔可夫模型基本算法[1] (20) 3.4.1 前向-后向算法 (20) 3.4.2 维特比算法 (24) 3.4.3 Baum-Welch 算法[1] (25)

3.5隐马尔可夫模型在人脸识别中应用 (28) 3.5.1 人脸图像HMM模型状态的确定 (28) 3.5.2 观察值序列 (29) 3.5.3 基于离散余弦变换(DCT)的特征提取方法 (30) 3.5.4 HMM建模训练和人脸识别工作流程 (32) 3.6改进的隐马尔可夫模型在人脸识别中的应用 (35) 3.6.1 观察向量的提取[15] (35) 3.6.2 人脸参数训练[15] (35) 3.6.3 人脸的识别 (36) 3.7小结 (37) 第4章人脸识别系统设计与试验 (38) 4.1人脸识别系统涉及的软件和硬件 (38) 4.1.1 软件部分 (38) 4.1.2 硬件部分 (42) 4.2人脸识别系统 (43) 4.2.1 用户界面介绍 (43) 4.2.2 主要模块介绍 (43) 4.2.3 程序实现界面 (47) 4.2.4 相关人脸数据库 (48) 4.3人脸识别试验 (51) 4.3.1 用Yale人脸库进行人脸识别试验 (51) 4.3.2 用ORL人脸库进行人脸识别试验 (54) 4.3.3 用自建的人脸库进行人脸识别试验 (56) 结论 (60) 致谢 (61) 参考文献 (62) 附录 (64)

人脸识别程序源代码

1.利用OpenCV进行人脸检测 人脸检测程序主要完成3部分功能,即加载分类器、加载待检测图象以及检测并标示。本程序使用OpenCV中提供的“haarcascade_frontalface_alt.xml”文件存储的目标检测分类,用cvLoad函数载入后,进行强制类型转换。OpenCV中提供的用于检测图像中目标的函数是cvHaarDetectObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图象中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回。分类器在使用后需要被显式释放,所用的函数为cvReleaseHaarClassifierCascade。这些函数原型请参看有关OpenCV手册。 2.程序实现 1)新建一个Visual C++ MFC项目,取名为“FaceDetection”,选择应用程序类型为“单文档”。将菜单中多余的项去掉,并添加一项“人脸检测”,其ID为“ID_FaceDetected”,并生成该菜单项的消息映射函数。 2)在“FaceDetectionView.h”头文件中添加以下灰底色部分程序代码:

3)在“FaceDetectionView.cpp”文件中添加以下灰底色部分程序代码:

需要注意的是,本程序运行时应将分类器文件置于程序目录下,如果运行的是生成的E XE文件,则应将分类器文件与该EXE文件放在同一个目录下。 三、程序运行结果 运行该程序,选择人脸检测菜单项,弹出文件打开对话框,选择要检测的图像文件,程序就会将检测到的人脸用圆圈标示出来,如图3所示。本程序能顺利检测出大部分人脸,但由于光照、遮挡和倾斜等原因,部分人脸不能正确检测,另外,也有一些非人脸部分由于具有人脸的某些特征,也被当成了人脸,这些都是本程序需要改进的部分。

基于matlab程序实现人脸识别

基于m a t l a b程序实现 人脸识别 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-

基于m a t l a b程序实现人脸识别 1.人脸识别流程 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显着不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。 人脸识别流程图 2.人脸识别程序 (1)人脸和非人脸区域分割程序 function result = skin(Y,Cb,Cr) %SKIN Summary of this function goes here % Detailed explanation goes here a=; b=; ecx=; ecy=; sita=; cx=; cy=; xishu=[cos(sita) sin(sita);-sin(sita) cos(sita)]; %如果亮度大于230,则将长短轴同时扩大为原来的倍 if(Y>230) a=*a; b=*b; end %根据公式进行计算 Cb=double(Cb); Cr=double(Cr);

t=[(Cb-cx);(Cr-cy)]; temp=xishu*t; value=(temp(1)-ecx)^2/a^2+(temp(2)-ecy)^2/b^2; %大于1则不是肤色,返回0;否则为肤色,返回1 if value>1 result=0; else result=1; end end (2)人脸的确认程序 function eye = findeye(bImage,x,y,w,h) %FINDEYE Summary of this function goes here % Detailed explanation goes here part=zeros(h,w); %二值化 for i=y:(y+h) for j=x:(x+w) if bImage(i,j)==0 part(i-y+1,j-x+1)=255; else part(i-y+1,j-x+1)=0; end end end [L,num]=bwlabel(part,8); %如果区域中有两个以上的矩形则认为有眼睛 if num<2 eye=0;

人脸识别系统设计与仿真 基于matlab的(含matlab源程序)版权不归自己 交流使用

人脸识别系统设计与仿真基于matlab的(含matlab源程序) 交流使用参考后自行那个删除后果自负 目录 第一章绪论 (2) 1.1 研究背景 (2) 1.2 人脸图像识别的应用前景 (3) 1.3 本文研究的问题 (4) 1.4 识别系统构成 (5) 1.5 论文的内容及组织 (7) 第二章图像处理的Matlab实现 (8) 2.1 Matlab简介 (8) 2.2 数字图像处理及过程 (8) 2.2.1图像处理的基本操作 (8) 2.2.2图像类型的转换 (9) 2.2.3图像增强 (9) 2.2.4边缘检测 (10) 2.3图像处理功能的Matlab实现实例 (11) 2.4 本章小结 (15) 第三章人脸图像识别计算机系统 (16) 3.1 引言 (16) 3.2系统基本机构 (17)

3.3 人脸检测定位算法 (18) 3.4 人脸图像的预处理 (25) 3.4.1 仿真系统中实现的人脸图像预处理方法 (26) 第四章基于直方图的人脸识别实现 (29) 4.1识别理论 (29) 4.2 人脸识别的matlab实现 (29) 4.3 本章小结 (30) 第五章总结 (31) 致谢 (32) 参考文献 (33) 附录 (35)

第一章绪论 本章提出了本文的研究背景及应用前景。首先阐述了人脸图像识别意义;然后介绍了人脸图像识别研究中存在的问题;接着介绍了自动人脸识别系统的一般框架构成;最后简要地介绍了本文的主要工作和章节结构。 1.1 研究背景 自70年代以来.随着人工智能技术的兴起.以及人类视觉研究的进展.人们逐渐对人脸图像的机器识别投入很大的热情,并形成了一个人脸图像识别研究领域,.这一领域除了它的重大理论价值外,也极具实用价值。 在进行人工智能的研究中,人们一直想做的事情就是让机器具有像人类一样的思考能力,以及识别事物、处理事物的能力,因此从解剖学、心理学、行为感知学等各个角度来探求人类的思维机制、以及感知事物、处理事物的机制,并努力将这些机制用于实践,如各种智能机器人的研制。人脸图像的机器识别研究就是在这种背景下兴起的,因为人们发现许多对于人类而言可以轻易做到的事情,而让机器来实现却很难,如人脸图像的识别,语音识别,自然语言理解等。如果能够开发出具有像人类一样的机器识别机制,就能够逐步地了解人类是如何存储信息,并进行处理的,从而最终了解人类的思维机制。 同时,进行人脸图像识别研究也具有很大的使用价依。如同人的指纹一样,人脸也具有唯一性,也可用来鉴别一个人的身份。现在己

人脸识别程序源代码

人脸识别程序源代码 Revised final draft November 26, 2020

1.利用OpenCV进行人脸检测 人脸检测程序主要完成3部分功能,即加载分类器、加载待检测图象以及检测并标示。本程序使用OpenCV中提供的“haarcascade_frontalface_alt.xml”文件存储的目标检测分类,用cv Load函数载入后,进行强制类型转换。OpenCV中提供的用于检测图像中目标的函数是cvHaarDet ectObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图象中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回。分类器在使用后需要被显式释放,所用的函数为cvReleaseHaarClassifierCascade。这些函数原型请参看有关OpenCV手册。 2.程序实现 1)新建一个VisualC++MFC项目,取名为“FaceDetection”,选择应用程序类型为“单文档”。将菜单中多余的项去掉,并添加一项“人脸检测”,其ID为“ID_FaceDetected”,并生成该菜单项的消息映射函数。 2)在“FaceDetectionView.h”头文件中添加以下灰底色部分程序代码: 3)在“FaceDetectionView.cpp”文件中添加以下灰底色部分程序代码:

需要注意的是,本程序运行时应将分类器文件置于程序目录下,如果运行的是生成的EXE文件,则应将分类器文件与该EXE文件放在同一个目录下。 三、程序运行结果 运行该程序,选择人脸检测菜单项,弹出文件打开对话框,选择要检测的图像文件,程序就会将检测到的人脸用圆圈标示出来,如图3所示。本程序能顺利检测出大部分人脸,但由于光照、遮挡和倾斜等原因,部分人脸不能正确检测,另外,也有一些非人脸部分由于具有人脸的某些特征,也被当成了人脸,这些都是本程序需要改进的部分。

人脸识别MATLAB代码

1.色彩空间转换 function [r,g]=rgb_RGB(Ori_Face) R=Ori_Face(:,:,1); G=Ori_Face(:,:,2); B=Ori_Face(:,:,3); R1=im2double(R); % 将uint8型转换成double型G1=im2double(G); B1=im2double(B); RGB=R1+G1+B1; row=size(Ori_Face,1); % 行像素 column=size(Ori_Face,2); % 列像素 for i=1:row for j=1:column rr(i,j)=R1(i,j)/RGB(i,j); gg(i,j)=G1(i,j)/RGB(i,j); end end rrr=mean(rr); r=mean(rrr); ggg=mean(gg); g=mean(ggg); 2.均值和协方差 t1=imread('D:\matlab\皮肤库\1.jpg');[r1,g1]=rgb_RGB(t1); t2=imread('D:\matlab\皮肤库\2.jpg');[r2,g2]=rgb_RGB(t2); t3=imread('D:\matlab\皮肤库\3.jpg');[r3,g3]=rgb_RGB(t3); t4=imread('D:\matlab\皮肤库\4.jpg');[r4,g4]=rgb_RGB(t4); t5=imread('D:\matlab\皮肤库\5.jpg');[r5,g5]=rgb_RGB(t5); t6=imread('D:\matlab\皮肤库\6.jpg');[r6,g6]=rgb_RGB(t6); t7=imread('D:\matlab\皮肤库\7.jpg');[r7,g7]=rgb_RGB(t7); t8=imread('D:\matlab\皮肤库\8.jpg');[r8,g8]=rgb_RGB(t8);

人脸识别源代码.doc

人脸识别源代码 ※人脸检测(文章+程序)---技术文档及代码非常全『人脸检测(文章+程序).rar(1.27 MB) 』 ※完整的Matlab下人脸检测及识别系统源代码『Face-Recognition-Detection.rar (393.19 KB) 』 注:这个人脸检测和识别系统开发于Matlab 7.0.1下,非常值得学习。 ※Matlab实现的基于颜色分隔的人脸人眼检测与定位及识别算法源代码 『Face-Eye-Detection.part1.rar (1.91 MB) Face-Eye-Detection.part2.rar (152.54 KB) 』 注:这是一个matlab程序,用来检测并定位人脸及人眼。采用的算法是肤色的颜色分隔。附件中的文件包括 eyematch.m, eyematch2.m, face.m, findeye.m,skin.m, k001.JPG等等。 ※完整的包括及动作识别的C++人脸检测源代码『FaceDetection.rar (875.84 KB) 』 本文的目的是提供一个我开发的SSE优化的,C++库,用于人脸检测,你可以马上把它用于你的视频监控系统中。涉及的技术有:小波分析,尺度缩减模型(PCA,LDA,ICA),人工神经网络(ANN),支持向量机(SVM),SSE编程,图像处理,直方图均衡,图像滤波,C++编程,还有一下其它的人脸检测的背景知识。 ※基于Gabor特征提取和人工智能的人脸检测系统源代码『fdp5final.rar(185.56 KB) 』 使用步骤: 1. 拷贝所有文件到MATLAB工作目录下(确认已经安装了图像处理工具箱和人工智能工具箱) 2. 找到"main.m"文件 3. 命令行中运行它

基于MATLAB的人脸识别

基于MATLAB的人脸识别

————————————————————————————————作者: ————————————————————————————————日期:

图像识别 题目:基于MATLAB的人脸识别 院系:计算机科学与应用系 班级: 姓名: 学号: 日期:

设计题目基于MATLAB的人脸识别设 计技术参数 测试数据库图片10张训练数据库图片20张图片大小1024×768 特征向量提取阈值 1 设计要求综合运用本课程的理论知识,并利用MATLAB作为工具实现对人脸图片的预处理,运用PCA算法进行人脸特征提取,进而进行人脸匹配识别。 工作量 两周的课程设计时间,完成一份课程设计报告书,包括设计的任务书、基本原理、设计思路与设计的基本思想、设计体会以及相关的程序代码; 熟练掌握Matlab的使用。 工作计划第1-2天按要求查阅相关资料文献,确定人脸识别的总体设计思路; 第3-4天分析设计题目,理解人脸识别的原理同时寻求相关的实现算法;第5-8天编写程序代码,创建图片数据库,运用PCA算法进行特征提取并编写特征脸,上机进行调试; 第9-12天编写人脸识别程序,实现总体功能; 第13-14天整理思路,书写课程设计报告书。 参考资料1 黄文梅,熊佳林,杨勇编著.信号分析与处理——MATALB语言及应用.国防科技大学出版社,2000 2 钱同惠编著.数字信号处理.北京:机械工业出版社,2004 3 姚天任,江太辉编著.数字信号处理.第2版.武汉:武汉理工大学出版社,2000 4 谢平,林洪彬,王娜.信号处理原理及应用.机械工业出版社,2004 5刘敏,魏玲.Matlab.通信仿真与应用.国防工业出版社,2005 6 楼顺天.基于Matlab7.x 的系统分析与设计.西安电子科技大学,2002 7孙洪.数字信号处理.电子工业出版社,2001 目录 引言?错误!未定义书签。 1 人脸识别技术?错误!未定义书签。 1.1人脸识别的研究内容?错误!未定义书签。 1.1.1人脸检测(Face Detection)........... 错误!未定义书签。

人脸识别程序源代码修订稿

人脸识别程序源代码 WEIHUA system office room 【WEIHUA 16H-WEIHUA WEIHUA8Q8-

1.利用OpenCV进行人脸检测 人脸检测程序主要完成3部分功能,即加载分类器、加载待检测图象以及检测并标示。本程序使用OpenCV中提供的“”文件存储的目标检测分类,用cv Load函数载入后,进行强制类型转换。OpenCV中提供的用于检测图像中目标的函数是cvHaarDetectObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图象中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回。分类器在使用后需要被显式释放,所用的函数为cvReleas eHaarClassifierCascade。这些函数原型请参看有关OpenCV手册。 2.程序实现 1)新建一个Visual C++ MFC项目,取名为“FaceDetection”,选择应用程序类型为“单文档”。将菜单中多余的项去掉,并添加一项“人脸检测”,其ID为“I D_FaceDetected”,并生成该菜单项的消息映射函数。 2)在“”头文件中添加以下灰底色部分程序代码:

} cvShowImage( "人脸检测", img ); cvReleaseImage( &gray ); cvReleaseImage( &small_img ); } 需要注意的是,本程序运行时应将分类器文件置于程序目录下,如果运行的是生成的EXE文件,则应将分类器文件与该EXE文件放在同一个目录下。 三、程序运行结果 运行该程序,选择人脸检测菜单项,弹出文件打开对话框,选择要检测的图像文件,程序就会将检测到的人脸用圆圈标示出来,如图3所示。本程序能顺利检测出大部分人脸,但由于光照、遮挡和倾斜等原因,部分人脸不能正确检测,另外,也有一些非人脸部分由于具有人脸的某些特征,也被当成了人脸,这些都是本程序需要改进的部分。

人脸识别matlab程序

人脸识别 % FaceRec.m % PCA 人脸识别修订版,识别率88% % calc xmean,sigma and its eigen decomposition allsamples=[];%所有训练图像 for i=1:40 for j=1:5 a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); % imshow(a); b=a(1:112*92); % b 是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上 到下,从左到右 b=double(b); allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数 据代表一张图片,其中M=200 end end samplemean=mean(allsamples); % 平均图片,1 × N for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M ×N 矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片” end; % 获取特征值及特征向量 sigma=xmean*xmean'; % M * M 阶矩阵 [v d]=eig(sigma); d1=diag(d); % 按特征值大小以降序排列 dsort = flipud(d1); vsort = fliplr(v); %以下选择90%的能量 dsum = sum(dsort); dsum_extract = 0; p = 0; while( dsum_extract/dsum < 0.9) p = p + 1; dsum_extract = sum(dsort(1:p)); end

(完整word版)基于MATLAB的人脸识别

图像识别 题目:基于MATLAB的人脸识别 院系:计算机科学与应用系 班级: 姓名: 学号: 日期:

目录 引言 (1) 1 人脸识别技术 (2) 1.1人脸识别的研究内容 (2) 1.1.1人脸检测(Face Detection) (2)

1.1.2人脸表征(Face Representation) (2) 1.2几种典型的人脸识别方法 (3) 1.2.1基于几何特征的人脸识别方法 (3) 1.2.2基于K-L变换的特征脸方法 (4) 1.2.3神经网络方法 (4) 1.2.4基于小波包的识别方法 (5) 1.2.5支持向量机的识别方法 (5) 2 人脸特征提取与识别 (5) 2.1利用PCA进行特征提取的经典算法——Eigenface算法 (6) 2.2 PCA人脸识别流程 (6) 2.3特征向量选取 (8) 2.4距离函数的选择 (9) 2.5 基于PCA的人脸识别 (9) MATLAB人脸识别程序 (10) 3 MATLAB软件程序编写 (10) 3.1.创建图片数据库 (10) 3.2 主程序 (11) 3.3最终程序结果 (12) 4 心得与体会 (12) 参考文献 (13)

引言 随着社会的发展及技术的进步,社会各方面对快速高效的自动身份验证的需求可以说无处不在,并与日俱增。例如,某人是否是我国的居民,是否有权进入某安全系统,是否有权进行特定的交易等。尤其是自2001年美国“9.1l”恐怖袭击发生以来,如何在车站、机场等公共场所利用高科技手段,迅速而准确地发现并确认可疑分子成了目前世界各国在反恐斗争中普遍关注的问题。为此,各国都投入大量人力、物力研究发展各类识别技术,使得生物特征识别技术得到了极大的发展。生物特征识别技术主要包括:人脸识别、虹膜识别、指纹识别、步态识别、语音识别、笔迹识别、掌纹识别以及多生物特征融合识别等。人类通过视觉识别文字,感知外界信息。在客观世界中,有75%的信息量都来自视觉,因此让计算机或机器人具有视觉,是人工智能的重要环节。由于生物特征是人的内在属性,具有很强的稳定性和个体差异性,因此是身份验证最理想的依据。与虹膜、指纹、基因、掌纹等其他人体生物特征识别系统相比,人脸识别系统更加直接、方便、友好,易于为用户所接受,并且通过人脸的表情、姿态分析,还能获得其它识别系统难以得到的一些信息。 人脸识别技术在国家重要机关及社会安防领域具有广泛用途。例如:公安系统的罪犯识别、信用卡验证、医学、档案管理、视频会议、人机交互系统等身份识别和各类卡持有人的身份验证。同其他人体生物特征(如:指纹、掌纹、虹膜、语音等)识别技术相比,人脸识别技术的隐性最好,人脸识别系统更直接、友好,是当今国际反恐和安防最重视的科技手段和攻关标志之一。虽然人类能毫不费力地识别出人脸及表情,但对人脸的机器自动识别确实一个难度极大的课题,它涉及到模式识别、图像处理及生理、心理学等诸多方面的知识。人脸识别技术的研究虽然己经取得了一定的可喜成果,但在实际应用中仍存在着许多严峻的问题。人脸的非刚体性、姿态、表情、发型以及化妆的多样性都给正确识别带来了困难,要让计算机像人一样方便地识别出大量的人脸,尚需不同科学研究领域的科学家共同不懈的努力。

基于matlab的人脸识别技术

基于matlab 的人脸识别技术 论文 摘要:随着计算机技术的飞速发展,人脸识别技术逐渐发展壮大起来,并应用到众多领域。 人脸识别是指在人脸检测的基础上针对输入的人脸图像,通过特征提取与特征匹配,找出与人脸库中匹配的人脸图像,从而达到识别效果。当前主要采取的人脸识别方法有:基于几何特征的方法 ,基于模板的方法和基于模型的方法。 这些方法较适合于人脸信息的验证,即待识别者是否为预先指定的对象。不足之处在于,需要建立一个拥有庞大人脸信息的训练样本库,因此就降低了输出结果的时效性和准确性。在应用领域中存在局限性,不适于具有庞大人脸样本训练库的身份鉴别领域。鉴于种种不足,本文提出了一种基于可变人脸库的快速人脸识别方法,使人脸识别技术适用于更多的行业。网络信息化时代的一大特征就是身份的数字化和隐性化,如何准确鉴定一个人的身份,保护信息安全是当今信息化时代必须解决的一个关键社会问题。正在悄然兴起的人脸识别技术正好可以解决这一问题。 关键词:模式识别,K-L 变换,人脸识别,图像处理,matlab,图像增强,边缘检测,图像预处理,灰度直方图,特征提取 1.1识别系统构成 自动人脸识别系统具有如图所示的一半框架并完成相应功能的任务。 (1)人脸图像的获取:一般来说,图像的获取都是通过摄像头摄取,氮摄取的图像可以是真人,也可以是人脸的图片或者为了相对简单,可以不考虑通过摄像头来摄取头像,而是直接给定要识别的图像。 (2)人脸的检测:人脸检测的任务是判断静态图像中是否存在人脸。若存在人脸,给出其在图像中的坐标位置,人脸区域大小等信息。而人脸跟踪需要进一步输出所检测到的人脸位置,大小等状态随时间的连续变化情况。 (3)特征提取通过人脸特征点的检测与标定可以确定人脸图像中显著特征点的位置(如眼睛,眉毛,鼻子,嘴巴等器官),同时还可以得到这些器官及其面部轮廓的形状信息的描述。 1.人脸特征提取的算法:K-L 变换是图像压缩中的一种最优正交变换,通过它可以把人脸样本从高维空间表示转换到低维空间表示,且由低维空恢复的人脸样本和原人脸样本具有最小的均方误差,从而可用人脸样本在低维空间的变换系数作为对人脸特征的描述。其中主元分析法(PCA )就是基于K-L 变换的一种比较流行的算法,它是统计学中分析数据的一种有效的方法,其目的是在数据间中找到一组向量以尽可能地解释数据的方差,将数据从原来的R 维空间将维投影到M 维空间(R>>M)并保存数据的主要信息,从而使数据更易于处理.按照K-L 变换识别算法流程.从人脸样本中提取面部特征.是人脸识别中重要步骤.其实质是一个从高维图像空间到低维数字空间的转换过程,可表示为:Y=T{x} 式中:x 表示原始数据,Y 表示为特征信息,T 表示映射 人脸样本特征提取算法如下:首先计算该库中所有样本的平均值(平均脸): ∑==p i n f P f 1 1 式中;P 表示照片数.f 表示每张照片的线性表示然后构建协方差矩阵: T T i p i i A A f f P C ?==∑=)'('11 式中:f f f i -='表示每张照片与样本平均值的差。A 表示差值形成的矩阵 接着,进行特征的提取:由于此协方差矩阵进行求解特征值和特征向量比较困难的,因此采用奇异值分解的方法得到特征矩阵。 i T i f U Y '=

基于opencv的人脸识别程序-代码详解

#include "cv.h" #include "highgui.h" #include #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw( IplImage* image ); const char* cascade_name = "haarcascade_frontalface_alt.xml";//人脸检测分类器 int main( int argc, char** argv ) { CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; int optlen = strlen("--cascade="); const char* input_name; if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ) { cascade_name = argv[1] + optlen; input_name = argc > 2 ? argv[2] : 0; } else { cascade_name = "E:\毕业设计\智能机器人动态人脸识别系统\陈建州程序.xml";//分类器路径 input_name = argc > 1 ? argv[1] : 0; } cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); if( !cascade )//如果没有找到分类器,输出以下 { fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); fprintf( stderr, "Usage: facedetect --cascade=\"\" [filename|camera_index]\n" ); return -1;

人脸识别PCA算法matlab实现及详细步骤讲解

%FaceRec.m %PCA人脸识别修订版,识别率88% %calc xmean,sigma and its eigen decomposition allsamples=[];%所有训练图像 for i=1:40 for j=1:5 a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); %imshow(a); b=a(1:112*92);%b是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上 到下,从左到右 b=double(b); allsamples=[allsamples;b];%allsamples是一个M*N矩阵,allsamples中每一行数 据代表一张图片,其中M=200 end end samplemean=mean(allsamples);%平均图片,1×N for i=1:200xmean(i,:)=allsamples(i,:)-samplemean;%xmean是一个M×N矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片” end; %获取特征值及特征向量 sigma=xmean*xmean';%M*M阶矩阵 [v d]=eig(sigma); d1=diag(d); %按特征值大小以降序排列 dsort=flipud(d1); vsort=fliplr(v); %以下选择90%的能量 dsum=sum(dsort); dsum_extract=0; p=0; while(dsum_extract/dsum<0.9) p=p+1; dsum_extract=sum(dsort(1:p)); end i=1; %(训练阶段)计算特征脸形成的坐标系 base=xmean'*vsort(:,1:p)*diag(dsort(1:p).^(-1/2)); %base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1) %详见《基于PCA的人脸识别算法研究》p31 %xmean'*vsort(:,i)是小矩阵的特征向量向大矩阵特征向量转换的过程 %while(i<=p&&dsort(i)>0) %base(:,i)=dsort(i)^(-1/2)*xmean'*vsort(:,i);%base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1) %详见《基于PCA的人脸识别算法研究》p31 %i=i+1;%xmean'*vsort(:,i)是小矩阵的特征向量向大矩阵特 征向量转换的过程 %end %以下两行add by gongxun将训练样本对坐标系上进行投影,得到一个M*p阶矩阵allcoor allcoor=allsamples*base;%allcoor里面是每张训练人脸图片在M*p子空间中的一个点,即在子空间中的组合系数, accu=0;%下面的人脸识别过程中就是利用这些组合系数来进行识别

[作业]OPENCV人脸识别

摘要 人脸检测主要是基于计算机识别的一项数字化技术,用以准确获取人的脸部大小和位置信息,在进行人脸检测时,突出主要的脸部特征,淡化次要的环境、衣着等因素。对于某些情况下,人脸检测也可以计算出人脸,如眼睛,鼻子和嘴等精确的微妙特征。由于在安全检测系统,医学,档案管理,视频会议和人机交互等领域人脸检测系统都有光明的应用前景,因此人脸检测逐渐成为了两个跨学科领域研究的热门话题:人工智能和当前模式识别。本文基于OpenCV视觉库具体的设计并开发了对数字图像中的人脸检测的程序,所采用的人脸检测的原理主要是分类器训练模式(Adaboost算法)提取Haar特征的方法。它在整个软件极其重要的作用,图像中人脸的准确定位和识别都受图像处理好坏的直接影响。本次所设计的软件在图像处理部分所采用的方法是基于Adaboost算法进行Haar特征的提取,在此之上加以通过积分图方法来获取完整的级联分类器结构,进行人脸检测时,OpenCV级联分类器通过Adaboost人脸检测算法进行训练,此后采用不同情况下的实验样本完成精确定位以及检测试验。经过代码的设计和调试,在最后的测试中针对数字图像进行的人脸检测和定位达到了较好的效果,提高了定位和识别的正确率。 关键词:人脸检测,AdaBoost,分类器,OpenCV

Abstract Face detection is mainly based on computer recognition of a digital technology,face size and location information to accurately obtain the person,during face detection, highlight the main facial features,dilute the secondary environment,clothing,and other factors.For some cases,face detection can also calculate a person's face,such as eyes, nose and mouth,and other subtle features accurate.Because in the field of human security detection systems,medical records management,video conferencing,and human-computer interaction face detection system has bright prospects,and therefore face detection is becoming a two interdisciplinary research fields hot topic:artificial intelligence and The current pattern recognition.This article is based.penCV vision library designed and developed specifically for digital image face detection process,the principles used face detection methods are mainly classifier training mode(Adaboost algorithm)to extract Haar features.It is in the vital role of the software,the image of the human face accurately locate and identify all that is good or bad a direct impact on the image processing.This software is designed image processing method used in part based Haar Adaboost algorithm to extract features,on top of this to be to get the full cascade classifier structure by integrating the diagram method for face detection,OpenCV cascade classifier is trained by Adaboost face detection algorithm,then the use of the experimental sample under different circumstances for accurate positioning and testing.Through design and debugging code,face detection and location in the final test for digital images to achieve better results and improve the accuracy of positioning and recognition. Keywords:face detection;AdaBoost;classifier;openCV

基于matlab的简单人脸识别程序代码

基于matlab的简单人脸识别实例 简介 人脸识别特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术。人脸识别是一项热门的计算机技术研究领域,在生活中许多领域都有着重要应用。 内容 这里通过对人脸图像打上网格,对区域块图像做二值分析,通过像素比例来做处理。进而得到人脸区域。 代码 % Bylyqmath % DLUT School of Mathematical Sciences % BLOG:https://www.sodocs.net/doc/1c2961221.html,/lyqmath clc; clear all; close all; % 载入图像 Img = imread('face.jpg'); if ndims(Img) == 3 I=rgb2gray(Img); else I = Img; end BW = im2bw(I, graythresh(I)); % 二值化 figure; subplot(2, 2, 1); imshow(Img); title('原图像', 'FontWeight', 'Bold'); subplot(2, 2, 2); imshow(Img); title('网格标记图像', 'FontWeight', 'Bold'); hold on; [xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ... round(linspace(1, size(I, 2), 10))); mesh(yt, xt, zeros(size(xt)), 'FaceColor', ... 'None', 'LineWidth', 3, ... 'EdgeColor', 'r'); subplot(2, 2, 3); imshow(BW); title('二值图像', 'FontWeight', 'Bold'); [n1, n2] = size(BW); r = floor(n1/10); % 分成10块,行 c = floor(n2/10); % 分成10块,列 x1 = 1; x2 = r; % 对应行初始化 s = r*c; % 块面积 for i = 1:10

照片人脸检测MATLAB代码(汇编)

% 载入图像 Img = imread('star1.jpg'); if ndims(Img) == 3 I=rgb2gray(Img); else I = Img; end BW = im2bw(I, graythresh(I)); % 二值化 figure; subplot(2, 2, 1); imshow(Img); title('原图像', 'FontWeight', 'Bold'); subplot(2, 2, 2); imshow(Img); title('网格标记图像', 'FontWeight', 'Bold'); hold on; [xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ... round(linspace(1, size(I, 2), 10))); mesh(yt, xt, zeros(size(xt)), 'FaceColor', ... 'None', 'LineWidth', 3, ... 'EdgeColor', 'r'); subplot(2, 2, 3); imshow(BW); title('二值图像', 'FontWeight', 'Bold'); [n1, n2] = size(BW); r = floor(n1/10); % 分成10块,行 c = floor(n2/10); % 分成10块,列 x1 = 1; x2 = r; % 对应行初始化 s = r*c; % 块面积 for i = 1:10 y1 = 1; y2 = c; % 对应列初始化 for j = 1:10 if (y2<=c || y2>=9*c) || (x1==1 || x2==r*10) % 如果是在四周区域 loc = find(BW(x1:x2, y1:y2)==0); [p, q] = size(loc); pr = p/s*100; % 黑色像素所占的比例数 if pr <= 100 BW(x1:x2, y1:y2) = 0; end end y1 = y1+c; % 列跳跃 y2 = y2+c; % 列跳跃 end x1 = x1+r; % 行跳跃 x2 = x2+r; % 行跳跃

相关主题