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个训练样本的结果来重构以前的人脸数据。
基本就是这么回事了。但是人脸特征识别我没研究过,你这个程序的算法非常的简单,至于为什么通过几个特征值分析就好用那我就不知道了,因为我没研究过这个。
你这个问题说的太大了,按我的理解,是只检测有没有人脸,而不检测是谁是吧。那就比较简单。计算的原理是当图中一片区域出现某个颜色的时候(比如黄种人就是黄色,这个颜色往往是个范围)则认为是有人。
我写的程序如下:
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
1.识别静态的整个人体较难;即使识别出来结果也不可靠,所以现在主要以手势/人脸识别为主;这是因为此握搜纯手和脸上面有比较独特的特征点。你说的滤波归根结底还是要找出具有灰度跳变的高频部分作为人体;这除非背景中除了人以外没有其他突出的物体;否则光凭滤波二值法检测人体是不太现实。2 两张图片中人要是产生相对运动,检测起来就容易多了;利用帧间差分找到图像中灰度相差大的部分(森漏庆你用的滤波也是一种手段);然后二值化区域连通;要是图像中没有其他移动物体计算连通区域的变动方向就是人的运动方向。
你可以去PUDN上搜搜相关的目标检测的代码完全和你这个对应是不可能的。照你说的情况可以先建立起静态背景的模型(或者直接在没人的时候拍张);然后不断的与这个背景做差,原理和帧间差分一样。建议你先从典型的帧间差分例程开始下手(比如移动车辆的检测,这个比较多)。
你在二值化之后加上一个区域连通的步骤;即使用膨胀或者闭运算;这样你的轮廓就是连续的了;用matlab的话bwlabel可以统计连通区域里面像素的个数也就是人体面积大小。质心就是横竖坐标的平均值;取所有人体点的横竖坐标分别累加;除以坐标总数得到的x和y平均值;这个就是质心了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)