| |
从上面的仿真可以看到,原始的代码对运动的提取效果较差,第一个背景处,左边的人的脑袋部分由于窗户的干扰,会出现一个长条影响,第二个图片。由于两个人的脑袋靠的比较近,所以会导致两个脑袋连在一起,同样,第三个图片,也是这个问题,这说明,原始的代码对背景的静态性要求较高,否则就会出现较大误差。
我们对这种类型的问题的做了几方面研究,具体可以参考我们提供的几个参考论文,总的归纳来讲又如下几个方面:
对于交叉问题,目前所了解的方法,视频必须满足如下几个要求:
第一:视频的背景需要静止,或者说不能又太大的抖动,否则会导致较大的干扰;
第二:视频上物体必须又出现物体分开的效果,这样可以提取物体物体的特征,所以你提供的第二个视频,两个人一直重合,这会导致无法识别;
第三:视频的特征提取方法,如果两个物体颜色相似,那么通过提取颜色是不可取的,如果根据动作来区分,如果两个物体运动一致,那么也不行,这里我们通过提取物体的形心来区分不同的物体,只有当两个物体完全重合的时候,形心才有可能重合;
第四:物体的分割,采用传统的方框来分,人物轮廓的分割方法在交叉的时候,或者是物体在较远的时候,不太可行。
原来的代码:SegObject.m function [PDF B L]=SegObject(K_cur, Options) m1=mean(K_cur(:)); m=max([Options.BlobTh m1+Options.BlobTh/2.0]); PDF=medfilt2(K_cur.*255,double([Options.MorphSz+1,Options.MorphSz+1])); BW=PDF>m; [B,L,N,A] = bwboundaries(BW, 8, 'noholes'); return; |
改动后的代码:SegObject.m function [PDF B L Ls BW3]=SegObject(K_cur, Options) m1=mean(K_cur(:)); m=max([Options.BlobTh m1+Options.BlobTh/2.0]); PDF=medfilt2(K_cur.*255,double([Options.MorphSz+1,Options.MorphSz+1])); BW=PDF>m; 01 [Ls,ns] = bwlabel(BW); 02 BW2(1:size(Ls,1),1:size(Ls,2)) = 0; 03 for i=1:ns 04 [r,c]=find(Ls==i); 06 b1(i)=max(c);b2(i)=min(c); 07 w(i)=b1(i)-b2(i); 08 h(i)=a1(i)-a2(i); 09 square(i) = w(i) * h(i); 10 LL1 = length(r); 11 if square(i) > 1000 12 for ii = 1:LL1 13 BW2(r(ii),c(ii)) = 1; 14 end 15 end 16 end 17 BW3(1:size(Ls,1),1:size(Ls,2)) = 0; 18 SE2 = strel('diamond', 6); 19 BW3=imdilate(BW2,SE2,'same'); %dilate [B,L,N,A] = bwboundaries(BW3, 8, 'noholes'); return; |
形心提取:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%--物体特征——形心的计算
%--物体特征——形心的计算
%--物体特征——形心的计算
nobjs = size(B,1);%运动物体的个数
%局部特征的提取
%计算形心坐标轨迹,当物体分开时进行计算,交叉时进行实时预测
%由前面几帧进行形心坐标点的计算
if nobjs >1%当有多个物体的时候,计算每个物体的形心值
这里,当物体单独出现的时候,即不交叉的时候,开始计算其形心;
index = index + 1;
for ii = 1:2
%实时计算坐标通过每个物体的轮廓的坐标点来计算物体的形心。
Xn(nseg,ii) =sum(B{ii}(:,2))/size(B{ii}(:,2),1);
Yn(nseg,ii) =sum(B{ii}(:,1))/size(B{ii}(:,1),1);
end
%用来保存物体运动的轮廓坐标,通常情况下,保留6个动作基本可以复现人体运动过程
Ax1s{nseg} = B{1}(:,2);%第1个物体运动的X坐标
Ax1{nseg} = Ax1s{nseg}-min(Ax1s{nseg});
Ax2s{nseg} = B{2}(:,2);%第2个物体运动的X坐标
Ax2{nseg} = Ax2s{nseg}-min(Ax2s{nseg});
Ay1{nseg} = B{1}(:,1);%第1个物体运动的Y坐标
Ay2{nseg} = B{2}(:,1);%第2个物体运动的Y坐标
end
if nobjs == 1%当发生运动交叉的时候,进行运动估计,获得形心的估计值
check_frame. = index;%记录交叉时刻的时间,即帧数
for jj = 2:size(Xn,1)
for ii = 1:2
dx(jj,ii) = Xn(jj,ii)-Xn(jj-1,ii);%计算物体形心的差分值