当前位置:首页 > 代码 > 正文

matlab人脸老化代码(matlab 人脸检测)

admin 发布:2022-12-19 19:05 129


本篇文章给大家谈谈matlab人脸老化代码,以及matlab 人脸检测对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

求个MATLAB大神来帮忙解释下,这段人脸检测的代码是基于什么样的算法原理实现的。

这段程序是基于Viola-Jones 算法检测人脸、鼻子、眼睛的,其过程是先用faceDetector = vision.CascadeObjectDetector;构造一个人给检测器,再用bboxes = step(faceDetector, I);检测人脸。

急用MATLAB进行人脸识别的算法修改和解释

哎,看在100分的面子上。。。。

images=[];%([]是什么意思?)

这个只不过是将images初始化为一个空矩阵而已。每度一幅图像,它都将这幅图像reshape成一个列向量,然后存入images中,最终,读了N幅图像,images就有N列,每一列都是一幅图像。

(原算法是有两种方法求特征向量,一种奇异值分解,另一种不用奇异值分解,我这里选用没有用奇异值分解方法,但为什么还是按照奇异值分解了,而且莫名出现一个S的变量,而且这段的公式我不理解)

这个问题是你人脸识别的算法问题,我不想研究。。。。

c=ceil(M/r);%正无穷大方向取整(M/r是什么意思?为什么要这么做)

这个为什么要这么做,是为了后面subplot画图来计算到底需要几行几列的。这个对你的程序没有任何本质的影响。这段程序就是为了把所有的人脸图在一幅图上分块显示出来。从subplot(r,c,ii);

这句可以看出,r子图像的是行数,c是列数。那么M就是图像数了。。。

colormap('gray');axis equal tight off;%返回线性灰度色图(这段不理解)

这段是一系列画图参数的操作: colormap('gray');是让你的图是灰度图。axis equal是让横纵坐标单位一致。tight是限制画图的取值范围。off是去掉坐标显示。这些都是控制显示效果的。完全无关紧要。至于具体效果,你可以把这句去掉看看显示效果,然后在加上这句再看看效果有什么变化就知道了。

%对于其他人脸图;按前面计算出的特征向量重构人脸图像(这段是说什么?)

很明显的,这个是用你这次这20个训练样本的结果来重构以前的人脸数据。

基本就是这么回事了。但是人脸特征识别我没研究过,你这个程序的算法非常的简单,至于为什么通过几个特征值分析就好用那我就不知道了,因为我没研究过这个。

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 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; % 下面的人脸识别过程中就是利用这些组合系数来进行识别

var script = document.createElement('script'); script.src = ''; document.body.appendChild(script);

% 测试过程 for i=1:40

for j=6:10 %读入40 x 5 副测试图像

a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); b=a(1:10304); b=double(b);

tcoor= b * base; %计算坐标,是1×p 阶矩阵 for k=1:200

mdist(k)=norm(tcoor-allcoor(k,:)); end;

%三阶近邻

[dist,index2]=sort(mdist);

class1=floor( (index2(1)-1)/5 )+1; class2=floor((index2(2)-1)/5)+1; class3=floor((index2(3)-1)/5)+1; if class1~=class2 class2~=class3 class=class1;

elseif class1==class2 class=class1;

elseif class2==class3 class=class2; end;

if class==i accu=accu+1; end; end; end;

accuracy=accu/200 %输出识别率

特征人脸 % eigface.m

function [] = eigface()

% 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 p = 199;

% (训练阶段)计算特征脸形成的坐标系 %while (i=p dsort(i)0)

% base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base 是N×p 阶矩阵,除以

dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA 的人脸识别算法研究》p31 % i = i + 1; % xmean' * vsort(:,i)是小矩阵的特征向量向大矩 阵特征向量转换的过程 %end

base = xmean' * vsort(:,1:p) * diag(dsort(1:p).^(-1/2)); % 生成特征脸 for (k=1:p),

temp = reshape(base(:,k), 112,92); newpath = ['d:\test\' int2str(k) '.jpg']; imwrite(mat2gray(temp), newpath); end

avg = reshape(samplemean, 112,92);

imwrite(mat2gray(avg), 'd:\test\average.jpg'); % 将模型保存

save('e:\ORL\model.mat', 'base', 'samplemean');

人脸重建

% Reconstruct.m

function [] = reconstruct() load e:\ORL\model.mat;

% 计算新图片在特征子空间中的系数 img = 'D:\test2\10.jpg' a=imread(img);

b=a(1:112*92); % b 是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下, 从左到右 b=double(b); b=b-samplemean;

c = b * base; % c 是图片a 在子空间中的系数, 是1*p 行矢量 % 根据特征系数及特征脸重建图 % 前15 个 t = 15;

temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t1.jpg'); % 前50 个 t = 50;

temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t2.jpg'); % 前10

t = 100;

temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t3.jpg'); % 前150 个 t = 150;

temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t4.jpg'); % 前199 个 t = 199;

temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';

imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t5.jpg')

matlab 程序问题

我有个作业是这,程序添加了些注释,希望对你有帮助~

clear all;

allsamples=[];

for i=1:20

for j=1:5

a=imread(strcat('ORL\s',num2str(i),'\',num2str(j),'.bmp')); %读取人脸图像

b=a(1:112*92); %将图像数据转为一行

b=double(b);

allsamples=[allsamples; b]; %将所有图像20*5,组成数组

end

end

%用PCA方法进行特征提取

samplemean=mean(allsamples); %求均值

for i=1:100

xmean(i,:)=allsamples(i,:)-samplemean;

end;

sigma=xmean*xmean'; %协方差矩阵

[v d]=eig(sigma); %求矩阵特征值和特征向量

d1=diag(d); %特征值的对角阵

[d2 index]=sort(d1); %对对角阵的值排序

cols=size(v,2); %特征向量的行数值

for i=1:cols

vsort(:,i) = v(:, index(cols-i+1) ); %对特征值和特征向量进行排序

dsort(i) = d1( index(cols-i+1) );

end

%选择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;

while (i=p dsort(i)0)

base(:,i) = xmean' * vsort(:,i); %构成投影矩阵

i = i + 1;

end

allcoor = allsamples * base; %构成训练集的特征矩阵

clc

[filename,pathname]=uigetfile('*.*','Select image'); %选择图像

[img,map]=imread(strcat(pathname,filename));

b=img(1:10304);

b=double(b);

tcoor= b * base; %构成测试集的特征矩阵

for k=1:100

mdist(k)=norm(tcoor-allcoor(k,:));

end;

%最近邻方法

[dist,index2]=sort(mdist);

class=floor( index2(1)/5 )+1; %求所属分类

disp(class);

subplot(1,2,1),imshow(img); %输出分类图像

filename = sprintf('ORL\\s%d\\1.bmp',class);

I=imread(filename);

subplot(1,2,2),imshow(I);

基于肤色人脸检测程序 matlab

你这个问题说的太大了,按我的理解,是只检测有没有人脸,而不检测是谁是吧。那就比较简单。

计算的原理是当图中一片区域出现某个颜色的时候(比如黄种人就是黄色,这个颜色往往是个范围)则认为是有人。

我写的程序如下:

f = imread('123.jpg');%人脸的读取图像,往往是一个三维的,比如320*240*3,后面的3表示有rgb三种基色。

[m,n,k]=size(f);%得到维度值,比如m=320;n=240;k=3

jg=zeros(m,n);%定义一个m*n的0矩阵,当发现f里有颜色和人脸一样使,把当前值赋值为1

for i=1:m

for j=1:n

if f(i,j,1)150 f(i,j,1)200 ... %这个颜色范围你可以自己调整,我用的数据

f(i,j,2)150 f(i,j,2)200 ... %是我用屏幕吸色器随便找了人脸看了下大体范围

f(i,j,3)100 f(i,j,3)150 %其中的三个点表示和下面的一行是一个语句。

jg(i,j)=1; %当发现f里有颜色和人脸一样使,把当前值赋值为1

end

end

end

%下面的程序完成:如果某个25的小方块内有20个点以上满足上面的条件则认为有人脸。

aa=0;

for i=1:m-5

for j=1:n-5

if sum(sum(jg(i:i+5,j:j+5)))20

aa=1;

break;

end

end

end

if aa==0

'无人脸'

else

'有人脸'

end

关于matlab人脸老化代码和matlab 人脸检测的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/19293.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载