用Matlab实现的人脸定位,急,期待高手解答

用Matlab实现的人脸定位,急,期待高手解答,第1张

大概看了一下,这个程序编得一团糟,肯定有问题~~~~看完头两个IF我已经疯了。编算法人的思路我说一下你就明白了。

读进一幅图,二进制化,也就是说比如200X120的矩阵,只有黑白,要么1,要么0.

用网格把它打成10X10的格子图,每格就有个20X12的小矩阵。然后

for i = 1:10

...

for j = 1:10

这两个FOR就是对这100个格子逐个进行分析,从格子1,一直到格子100,但实际上后面就发现是对对这100个格子的边缘格子进行分析 ,中间不动(就是假设 边缘最没用,脸不会出现在那儿,能扔就扔掉)

if (y2<=c | y2>=9*c) | (x1==1 | x2==r*10) % 保证是在边缘的格子里面

loc=find(BW(x1:x2, y1:y2)==0)% 这个格子(矩阵)里,有多少值为0的元素,即为背景元素,没用的,不是人脸。(所以这段 程序开头写了“将背景部分弱化”。

[o p]=size(loc)% 噢,找到了这么多个0

pr=o*100/s

% 用pr值 来判断是否应该将这整个格子全部值 赋为0,比如一个格子里面只有几个1(比如几根头发),其它全是无用的信息0,那么干脆就把这个格子全部变成0,免得影响判断。pr的定义是有问题的,因为o永远小于s(你可以自己算算),所以所有的边缘格都会强行被赋为0,就是“全黑了”。

if pr<=100

BW(x1:x2, y1:y2)=0

r1=x1r2=x2s1=y1s2=y2% 这句话P用没有,整个程序前后都没出现r1,r2,s1,s2,在这儿定义有什么用?

pr1=0%同样是句P话,其他地方都没出现过pr1

end

end

y1=y1+c

y2=y2+c

end

x1=x1+r

x2=x2+r

然后这几句就是格子赋值 结束,继续前进,找下一个格子呗,又回到初始。。。

所以,上面这段程序,什么人脸不人脸检测的,就是把边缘全部变黑而己……

所以下面我也看不进去了。。。

补充:

还是说完吧,后面一段程序,其实就是把所有变黑的边缘的边界给勾了出来。没有任何新东西。。。

所以你这段程序,就是先把边缘全部抹黑,然后勾出这个边缘的边界,画出来,就行了。没有任何“人脸定位”的东西,就是假设人脸在图的中间,边缘没有任何信息。。。仅此而己~~~

步骤如下:

人脸识别 % 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')

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

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

我写的程序如下:

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


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存