这段MATLAB代码似乎是用来在摄像头中实时检测人脸的。让我来帮你解释一下各个部分的作用:
clc:清除命令行上的所有输出。
clear all:删除所有变量。
close all:关闭所有图窗。
web = webcam():创建一个webcam对象。
pic =web.snapshot:使用webcam对象捕获一张图像。
detface=vision.CascadeObjectDetector():创建一个脸部检测器。
imshow(pic):显示图像。
while true:开始一个无限循环。
pic=web.snapshot:使用webcam对象捕获一张图像。
pic2=rgb2gray(pic):将图像转换为灰度图像。
bbox = step(detface,pic):使用脸部检测器在图像中检测脸部。
img = insertObjectAnnotation(pic,... 'rectangle',bbox,'Face'):在图像中标记出检测到的脸部。
imshow(img):显示标记后的图像。
希望这些解释能帮助您理解代码的作用。
大概看了一下,这个程序编得一团糟,肯定有问题~~~~看完头两个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
然后这几句就是格子赋值 结束,继续前进,找下一个格子呗,又回到初始。。。
所以,上面这段程序,什么人脸不人脸检测的,就是把边缘全部变黑而己……
所以下面我也看不进去了。。。
补充:
还是说完吧,后面一段程序,其实就是把所有变黑的边缘的边界给勾了出来。没有任何新东西。。。
所以你这段程序,就是先把边缘全部抹黑,然后勾出这个边缘的边界,画出来,就行了。没有任何“人脸定位”的东西,就是假设人脸在图的中间,边缘没有任何信息。。。仅此而己~~~
function []=TwoDPCA
%%%%%%%%%%%%%特征脸显示已正确,训练与测试没有分开。
% Face recognition
clear all
close all
clc
M=200%%%%
traincopy=5%%%表示同一个人有几张相片。
eignum=3%%%选取的特征个数。
cel=cell(1,M)
cellafter=cell(1,M)
tt=clock
S=[]
ii=1
str=strcat('E:\三维人脸\2dfacedatabase\ORL\s1\1.pgm')
img=imread(str)
[ia ib]=size(img)
sum=zeros(ia,ib)
B=zeros(ia,ib)
for i=1:40
for j=1:5
str=strcat('E:\三维人脸\2dfacedatabase\ORL\s',int2str(i),'\',int2str(j),'.pgm')
eval('img=imread(str)')
sum=double(sum)+double(img)
cel{1,ii}=img
ii=ii+1
end
end
meanA=sum/M
cov=zeros(ib)
for i=1:M
img=cel{1,i}
B=double(img)-double(meanA)
temp=B'*B
cov=double(cov)+double(temp)
end
[vv dd]=eig(cov)
num2=size(vv)
% Sort and eliminate those whose eigenvalue is zero
v=[]
d=[]
for i=1:size(vv,2)
if(dd(i,i)>1e-4)
v=[v vv(:,i)]
d=[d dd(i,i)]
end
end
num1=size(v,2)
%sort, will return an ascending sequence
[B index]=sort(d)
ind=zeros(size(index))
dtemp=zeros(size(index))
vtemp=zeros(size(v))
len=length(index)
for i=1:len
dtemp(i)=B(len+1-i)
ind(i)=len+1-index(i)
vtemp(:,ind(i))=v(:,i)
end
d=dtemp
v=vtemp
imgafter=[]
for i=1:M
for j=1:eignum
img=cel{1,i}
temp1=double(img)*double(v(:,j))
imgafter=[imgafter temp1]
end
cellafter{1,i}=imgafter
imgafter=[]
end
timeconsume=etime(clock,tt)
testimg=M/traincopy
findimgnum=traincopy
suc=0
% figure(5)
for k=1:testimg
InputImage =imread(strcat('E:\三维人脸\2dfacedatabase\ORL\s',int2str(k),'\10.pgm'))
testafter=[]
for j=1:eignum
temp=double(InputImage)*double(v(:,j))
testafter=[testafter temp]
end
% Find Euclidean distance
e=[]
for i=1:M
tempA=double(testafter)-double(cellafter{1,i})
total=0
for j=1:eignum
aa=norm(tempA(:,j))
total=total+aa
end
e=[e total]
end
[C index]=sort(e)
min=index(1)
%%%%%%%计算正确率
testingroup=floor((min-1)/traincopy)+1%%计算要测试的图像所在的组
if testingroup==k
suc=suc+1
else
fprintf('%d.jpg fails to match!\n',k)
end
% %%%%%%%%%%%%%%%%%%%显示所有找到的与测试图像为同一个人的图片(可)。(显示所有与测试图片最小距离的那组,而不是比较出来的最小的5个)
% subplot(testimg,findimgnum+1,(k-1)*(findimgnum+1)+1)% subplot(行数,列数,放图像位置的序数)
% imshow(InputImage)
%
% for i=1:findimgnum
% temppos=(testingroup-1)*traincopy+i
% str=strcat('E:\三维人脸\testpic\orl\',int2str(temppos),'.pgm') %concatenates two strings that form the name of the image
% eval('img1=imread(str)')
% subplot(testimg,findimgnum+1,(k-1)*(findimgnum+1)+i+1)
% imshow(img1)
% drawnow
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
sucrate=suc/M*traincopy*100
fprintf('%2.1f%% matched successfully!\n',sucrate)
fprintf('it takes %3.2f S\n',timeconsume)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)