matlab人脸检测步骤

matlab人脸检测步骤,第1张

步骤如下:

人脸识别 % 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=[allsamplesb]% 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 = 0p = 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 = 'http://static.pay.baidu.com/resource/baichuan/ns.js'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 )+1class2=floor((index2(2)-1)/5)+1class3=floor((index2(3)-1)/5)+1if class1~=class2 &&class2~=class3 class=class1

elseif class1==class2 class=class1

elseif class2==class3 class=class2end

if class==i accu=accu+1endendend

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=[allsamplesb]% 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 = 0p = 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')

function cat_mouse

clear

clc

mov=avifile('cat_mouse.avi')

ts=0:0.005:0.5

x0=[0,0]

[t,x]=ode45(@cat_m,ts,x0)

n=length(x)

figure(1)

plot(0,0,'.')

hold on

h1=line( 'Color' ,[0 0 1], 'Marker' , '.' , 'MarkerSize' ,40, 'EraseMode' , 'xor' )

h2=line(15,0,'MarkerFaceColor',[0 1 0],'段薯Marker','h', 'MarkerSize' ,15, 'EraseMode' , 'xor')

plot(15,0,'.')

line([15 15],[0 11],'LineWidth',2)

axis equal

axis([0 16 0 11])

title('猫追耗子动画演示')

for i=1:n-1

plot(x([i i+1],1),x([i i+1],2))

set(h1, 'xdata' ,x(i+1,1), 'ydata' ,x(i+1,2))

set(h2, 'xdata' ,15, 'ydata' ,20*t(i+1))

drawnow% 刷新屏幕

pause(0.005)

f=getframe(gcf)

mov=addframe(mov,f)

end

hold off

mov=close(mov)

后面是子程序

function dx=cat_m(t,x)

a=20b=40c=15

s=sqrt((c-x(1))^2+(a*t-x(2))^2)

dx=[b*(c-x(1))/sb*(a*t-x(2))/s]

上次看到一橘颂个网友做的猫捉老鼠的实现,其实就是握伍者导d追踪问题


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12389063.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存