哎,看在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个训练样本的结果来重构以前的人脸数据。
基本就是这么回事了。但是人脸特征识别我没研究过,你这个程序的算法非常的简单,至于为什么通过几个特征值分析就好用那我就不知道了,因为我没研究过这个。
% % % % %的RGB图像
我= imread(“touxiangjpg”);
我= rgb2gray(我);
BW = im2bw(I);%二值化
图中,imshow(BW)
[n1n2]=大小(BW);
r =地板(n1/10);%分成十块,行
c =地板(n2/10);%分成十块,列%取最近的较小整数
x1 = 1;x2 = r %对应行初始化
s = r c;%块面积
市中心= 1:10 %以图像尺寸百分之一的窗口大小滑动
日元= 1;y2 = c;%对应列初始化
j = 1:10
如果(y2 < = c | y2 > = 9 c)|(x1 = = 1 | x2 = = r 10)%这一判断条件就是把图像最外围全部归零
loc =找到(BW(x1,x2,y1,y2)= = 0);%找到查找矩阵中满足条件的位置,[r、c、v]=找到(X),r、c为不为零元素的行,列v为其数值,X也可由逻辑表达式替代
%这里loc应该是BW窗口中的为黑像素的个数,就是后面的o值,在下面的如果中做了一个条件判断
[o p]=大小(loc);
公关= o 100 / s;%黑色像素所占的比例数
如果公关< = 100
BW(x1,x2,y1,y2)= 0;
r1 = x1,x2 r2 =;s1 = y1,s2 =日元;
pr1 = 0;
结束
imshow(BW);
结束
日元= y1 + c;%列跳跃
y2 = y2 + c;%列跳跃
结束
x1 = x1 + r;%行跳跃
x2 = x2 + r;%行跳跃
结束
图中,imshow(BW)
L = bwlabel(BW,8);;%标记图像中的八连通区域
的边界框(BB = regionprops(L’,大小));%区域特征,BoundingBox是指包围每个区域的最小矩形,数目与数字相等
%区域特征还包含区域,即每个区域的像素数重心
%即每个区域的重心
位= struct2cell(BB);%此函数是将结构体中各变量的值分别提取出了组成一个元胞矩阵
BB2组= cell2mat(位);%将单个的元胞矩阵组成一个单一矩阵
[s1s2]=大小(BB2组);%因为BB矩阵存储的是矩形的对角坐标,是四位,所以又元组矩阵转变成单一矩阵
mx = 0;
叉= 3:4:s2 - 1%每四个数字对应一个矩形,matlab中的数组下标都是从1开始
p = BB2组(k) BB2组(k + 1);%宽高
如果p > mx &(BB2组(k)/ BB2组(1、k + 1))< 18%如果满足面积块大,而且宽/高< 18
mx = p;
j = k;
结束
结束
图中,imshow(我);
holdon;
矩形(“位置”,[BB2组(1、j-2)BB2组(j - 1),BB2组(j),BB2组(1 + 1)]、“EdgeColor”、“r”)
sh167779@163com
求程序
程序执行过程为:
程序运行后首先提示将TestDatabase,TrainDatabase两个文件夹添加到路径中
然后提示从TestDatabase中随便选择一张,程序会从TrainDatabase中选出与刚才所选相同的
效果如下
手选
程序挑出来的
主程序代码如下:
clear all
clc
close all
% You can customize and fix initial directory paths
TrainDatabasePath = uigetdir(strcat(matlabroot,'\work'), 'Select training database path' );
TestDatabasePath = uigetdir(strcat(matlabroot,'\work'), 'Select test database path');
prompt = {'Enter test image name (a number between 1 to 10):'};
dlg_title = 'Input of FLD-Based Face Recognition System';
num_lines= 1;
def = {'1'};
TestImage = inputdlg(prompt,dlg_title,num_lines,def);
TestImage = strcat(TestDatabasePath,'\',char(TestImage),'jpg');
im = imread(TestImage);
T = CreateDatabase(TrainDatabasePath);
[m V_PCA V_Fisher ProjectedImages_Fisher] = FisherfaceCore(T);
OutputName = Recognition(TestImage, m, V_PCA, V_Fisher, ProjectedImages_Fisher);
SelectedImage = strcat(TrainDatabasePath,'\',OutputName);
SelectedImage = imread(SelectedImage);
imshow(im)
title('Test Image');
figure,imshow(SelectedImage);
title('Equivalent Image');
str = strcat('Matched image is : ',OutputName);
disp(str)
1、设计流程:清除环境变量 人脸特征向量提取 训练集/测试集产生 创建神经网络 训练网络
仿真测试 结果显示
2、提取特征向量
一般提取左方' '左前方' '前方' '右前方' '右方的特征
3、只有训练过了 输入一张 才能提取特征 进行比对啊 才知道人脸的朝向
1识别静态的整个人体较难;即使识别出来结果也不可靠,所以现在主要以手势/人脸识别为主;这是因为手和脸上面有比较独特的特征点。你说的滤波归根结底还是要找出具有灰度跳变的高频部分作为人体;这除非背景中除了人以外没有其他突出的物体;否则光凭滤波二值法检测人体是不太现实。
2 两张中人要是产生相对运动,检测起来就容易多了;利用帧间差分找到图像中灰度相差大的部分(你用的滤波也是一种手段);然后二值化区域连通;要是图像中没有其他移动物体计算连通区域的变动方向就是人的运动方向。
你可以去PUDN上搜搜相关的目标检测的代码;完全和你这个对应是不可能的。照你说的情况可以先建立起静态背景的模型(或者直接在没人的时候拍张);然后不断的与这个背景做差,原理和帧间差分一样。建议你先从典型的帧间差分例程开始下手(比如移动车辆的检测,这个比较多)。
你在二值化之后加上一个区域连通的步骤;即使用膨胀或者闭运算;这样你的轮廓就是连续的了;用matlab的话bwlabel可以统计连通区域里面像素的个数也就是人体面积大小。质心就是横竖坐标的平均值;取所有人体点的横竖坐标分别累加;除以坐标总数得到的x和y平均值;这个就是质心了
以上就是关于急用MATLAB进行人脸识别的算法修改和解释全部的内容,包括:急用MATLAB进行人脸识别的算法修改和解释、求MATLAB大神翻译一下这个人脸识别程序,以及大段落分别要要实现什么功能虽然有的有注释,但是不全。、谁能帮我运行一下这个人脸识别的代码 。Matlab的代码,急需啊!把运行的数据和运行结果截图给我,谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)