PCA人脸识别程序问题
file:///C:/Program Files/MATLAB/R2010a/bin/html/FaceRec.html
代码调试好之后运行,出现这个问题:
??? Undefined function or method 'filpud' for input arguments of type 'double'.
以前没遇见过,求大牛指点。
人脸识别MATLAB代码1
1。色彩空间转换
function [r,g]=rgb_RGB(Ori_Face) ??????[r,g]代表什么,相当于z=(x,y)这样的函数吗
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);????????why use "mean" again求两次mean为什么
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);
t9=imread('D:matlab皮肤库9。
jpg');[r9,g9]=rgb_RGB(t9);
t10=imread('D:matlab皮肤库10。jpg');[r10,g10]=rgb_RGB(t10);
t11=imread('D:matlab皮肤库11。
jpg');[r11,g11]=rgb_RGB(t11);
t12=imread('D:matlab皮肤库12。jpg');[r12,g12]=rgb_RGB(t12);
t13=imread('D:matlab皮肤库13。
jpg');[r13,g13]=rgb_RGB(t13);
t14=imread('D:matlab皮肤库14。jpg');[r14,g14]=rgb_RGB(t14);
t15=imread('D:matlab皮肤库15。
jpg');[r15,g15]=rgb_RGB(t15);
t16=imread('D:matlab皮肤库16。jpg');[r16,g16]=rgb_RGB(t16);
t17=imread('D:matlab皮肤库17。
jpg');[r17,g17]=rgb_RGB(t17);
t18=imread('D:matlab皮肤库18。jpg');[r18,g18]=rgb_RGB(t18);
t19=imread('D:matlab皮肤库19。
jpg');[r19,g19]=rgb_RGB(t19);
t20=imread('D:matlab皮肤库20。jpg');[r20,g20]=rgb_RGB(t20);
t21=imread('D:matlab皮肤库21。
jpg');[r21,g21]=rgb_RGB(t21);
t22=imread('D:matlab皮肤库22。jpg');[r22,g22]=rgb_RGB(t22);
t23=imread('D:matlab皮肤库23。
jpg');[r23,g23]=rgb_RGB(t23);
t24=imread('D:matlab皮肤库24。jpg');[r24,g24]=rgb_RGB(t24);
t25=imread('D:matlab皮肤库25。
jpg');[r25,g25]=rgb_RGB(t25);
t26=imread('D:matlab皮肤库26。jpg');[r26,g26]=rgb_RGB(t26);
t27=imread('D:matlab皮肤库27。
jpg');[r27,g27]=rgb_RGB(t27);
r=cat ????????????how to use:cat?cat函数怎么用?????
(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27);
g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27);
m=mean([r,g])
n=cov([r,g])
3。
求质心
function [xmean, ymean] = center(bw) bw is a new image???
bw=bwfill(bw,'holes'); ???????"holes"is what%二值图像背景区域填充bwfill函数不会用,holes代表什么
area = bwarea(bw); %计算二值图像中的目标区域
人脸识别MATLAB代码2
[m n] =size(bw);
bw=double(bw);
xmean =0; ymean = 0;
for i=1:m,
for j=1:n,
xmean = xmean j*bw(i,j);
ymean = ymean i*bw(i,j);???xmean is what
end;
end;
if(area==0)
xmean=0;
ymean=0;
else
xmean = xmean/area;
ymean = ymean/area;
xmean = round(xmean);
ymean = round(ymean); %向最近整数元整
end
4。
求偏转角度
function [theta] = orient(bw,xmean,ymean)
[m n] =size(bw);
bw=double(bw);
a = 0;
b = 0;
c = 0;
for i=1:m,
for j=1:n,
a = a (j - xmean)^2 * bw(i,j);
b = b (j - xmean) * (i - ymean) * bw(i,j);
c = c (i - ymean)^2 * bw(i,j);
end;
end;
b = 2 * b;
theta = atan(b/(a-c))/2;
theta = theta*(180/pi); % 从幅度转换到角度
5。
找区域边界
function [left, right, up, down] = bianjie(A)
[m n] = size(A);
left = -1;
right = -1;
up = -1;
down = -1;
for j=1:n,
for i=1:m,
if (A(i,j) ~= 0) ???? ~ is what?是不等于0的意思吗?????
left = j;
break;
end;
end;
if (left ~= -1) break;
end;
end;
for j=n:-1:1,
for i=1:m,
if (A(i,j) ~= 0)
right = j;
break;
end;
end;
if (right ~= -1) break;
end;
end;
for i=1:m,
for j=1:n,
if (A(i,j) ~= 0)
up = i;
break;
end;
end;
if (up ~= -1)
break;
end;
end;
for i=m:-1:1,????????m:-1:1 is what?什么意思????????、、
for j=1:n,
if (A(i,j) ~= 0)
down = i;
break;
end;
end;
if (down ~= -1)
break;
end;
end;
6。
求起始坐标
function newcoord = checklimit(coord,maxval)
newcoord = coord;?????????coord and maxval represent what?代表什么意思
if (newcoordmaxval)
newcoord=maxval;
end;
7。
模板匹配
function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)
frontalmodel=rgb2gray(frontalmodel);
model_rot = imresize(frontalmodel,[ly wx],'bilinear'); % 调整模板大小
model_rot = imrotate(model_rot,angle,'bilinear'); % 旋转模板
[l,r,u,d] = bianjie(model_rot); % 求边界坐标
bwmodel_rot=imcrop(model_rot,[l u (r-l) (d-u)]); % 选择模板人脸区域
[modx,mody] =center(bwmodel_rot); % 求质心
[morig, norig] = size(bwmodel_rot);
% 产生一个覆盖了人脸模板的灰度图像
mfit = zeros(size(mult));
mfitbw = zeros(size(mult));?????????why need two zeros ?创建0矩阵有什么用途,为什么创建两个
[limy, limx] = size(mfit);????mfit's number isn't mult's?mfit的大小不就是mult的吗???
% 计算原图像中人脸模板的坐标
startx = cx-modx;
starty = cy-mody;
endx = startx norig-1;
endy = starty morig-1;
startx = checklimit(startx,limx);????checklimit is what?这个函数怎么用
starty = checklimit(starty,limy);
endx = checklimit(endx,limx);
endy = checklimit(endy,limy);
for i=starty:endy,
for j=startx:endx,
mfit(i,j) = model_rot(i-starty 1,j-startx 1);
end;
end;
ccorr = corr2(mfit,mult) % 计算相关度
[l,r,u,d] = bianjie(bwmodel_rot);
sx = startx l;
sy = starty u;
RectCoord = [sx sy (r-1) (d-u)]; % 产生矩形坐标
8。
主程序
clear;
[fname,pname]=uigetfile({'*。jpg';'*。bmp';'*。tif';'*。gif'},'Please choose a color picture。。
。');
% 返回打开的图片名与图片路径名
[u,v]=size(fname);
y=fname(v); ???????? % 图片格式代表值 这个函数不会用????????
switch y
case 0
errordlg('You Should Load Image File First。
。。','Warning。。。');
case{'g';'G';'p';'P';'f';'F'}; % 图片格式若是JPG/jpg、BMP/bmp、TIF/tif或者GIF/gif,才打开
I=cat(2,pname,fname);?????????/ cat函数????????、、
Ori_Face=imread(I);
subplot(2,3,1),imshow(Ori_Face);
otherwise
errordlg('You Should Load Image File First。
。。','Warning。。。');
end
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;
人脸识别MATLAB代码4
m=[ 0。
4144,0。3174]; % 均值
n=[0。0031,-0。0004;-0。0004,0。0003]; % 方差
row=size(Ori_Face,1); % 行像素数
column=size(Ori_Face,2); % 列像素数
for i=1:row
for j=1:column
if RGB(i,j)==0
rr(i,j)=0;gg(i,j)=0;????????where comes rr gg rr和gg是从哪里来的????
else
rr(i,j)=R1(i,j)/RGB(i,j); % rgb归一化
gg(i,j)=G1(i,j)/RGB(i,j);
x=[rr(i,j),gg(i,j)];
p(i,j)=exp((-0。
5)*(x-m)*inv(n)*(x-m)'); % 皮肤概率服从高斯分布
end
end
end
subplot(2,3,2);imshow(p); % 显示皮肤灰度图像
low_pass=1/9*ones(3);
image_low=filter2(low_pass, p); % 低通滤波去噪声
subplot(2,3,3);imshow(image_low);
% 自适应阀值程序
previousSkin2 = zeros(i,j);
changelist = [];????????????这是什么意思???????、、
for threshold = 0。
55:-0。1:0。05
two_value = zeros(i,j);
two_value(find(image_low>threshold)) = 1;
change = sum(sum(two_value - previousSkin2));
changelist = [changelist change];
previousSkin2 = two_value;
end
[C, I] = min(changelist);
optimalThreshold = (7-I)*0。
1
two_value = zeros(i,j);
two_value(find(image_low>optimalThreshold)) = 1; % 二值化
subplot(2,3,4);imshow(two_value); % 显示二值图像
frontalmodel=imread('E:我的照片人脸模板。
jpg'); % 读入人脸模板照片
FaceCoord=[];????????????????????什么意思???????????
imsourcegray=rgb2gray(Ori_Face); % 将原照片转换为灰度图像
[L,N]=bwlabel(two_value,8); % 标注二值图像中连接的部分,L为数据矩阵,N为颗粒的个数
for i=1:N,
[x,y]=find(bwlabel(two_value)==i); % 寻找矩阵中标号为i的行和列的下标
bwsegment = bwselect(two_value,y,x,8); % 选择出第i个颗粒
numholes = 1-bweuler(bwsegment,4); % 计算此区域的空洞数
if (numholes >= 1) % 若此区域至少包含一个洞,则将其选出进行下一步运算
RectCoord = -1;
[m n] = size(bwsegment);
[cx,cy]=center(bwsegment); % 求此区域的质心
bwnohole=bwfill(bwsegment,'holes'); % 将洞封住(将灰度值赋为1)
justface = uint8(double(bwnohole) 。
* double(imsourcegray));
% 只在原照片的灰度图像中保留该候选区域
angle = orient(bwsegment,cx,cy); % 求此区域的偏转角度
bw = imrotate(bwsegment, angle, 'bilinear');
bw = bwfill(bw,'holes');
[l,r,u,d] =bianjie(bw);
wx = (r - l 1); % 宽度
ly = (d - u 1); % 高度
wratio = ly/wx % 高宽比
if ((0。
8<=wratio)&(wratio<=2))
% 如果目标区域的高度/宽度比例大于0。8且小于2。
0,则将其选出进行下一步运算
S=ly*wx; % 计算包含此区域矩形的面积
这就是一个纯人脸识别的程序,特征提取我也有,最近弄人脸识别,大家可以互相学习,呵呵。
问:人脸识别?我看的联想笔记本有一个人脸识别,请问这是什么?
答:可以代替帐号密码的烦琐形式,满足一般用户的系统安全,但现在人脸识别技术还不是很成熟,复杂环境、光照、人脸姿态等问题都人脸识别的影响都没有很好地解决,识别误差还是...详情>>