网站最新上线:http://www.hslogic.com/

hslogic-matlab算法仿真-人运动交叉识别

上一篇 / 下一篇  2018-02-07 01:31:49

从上面的仿真可以看到,原始的代码对运动的提取效果较差,第一个背景处,左边的人的脑袋部分由于窗户的干扰,会出现一个长条影响,第二个图片。由于两个人的脑袋靠的比较近,所以会导致两个脑袋连在一起,同样,第三个图片,也是这个问题,这说明,原始的代码对背景的静态性要求较高,否则就会出现较大误差。

    我们对这种类型的问题的做了几方面研究,具体可以参考我们提供的几个参考论文,总的归纳来讲又如下几个方面:

对于交叉问题,目前所了解的方法,视频必须满足如下几个要求:

第一:视频的背景需要静止,或者说不能又太大的抖动,否则会导致较大的干扰;

第二:视频上物体必须又出现物体分开的效果,这样可以提取物体物体的特征,所以你提供的第二个视频,两个人一直重合,这会导致无法识别;

    第三:视频的特征提取方法,如果两个物体颜色相似,那么通过提取颜色是不可取的,如果根据动作来区分,如果两个物体运动一致,那么也不行,这里我们通过提取物体的形心来区分不同的物体,只有当两个物体完全重合的时候,形心才有可能重合;

    第四:物体的分割,采用传统的方框来分,人物轮廓的分割方法在交叉的时候,或者是物体在较远的时候,不太可行。

原来的代码: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);

05                a1(i)=max(r);a2(i)=min(r);

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);%计算物体形心的差分值

TAG:

引用 删除 冰溯   /   2018-03-08 09:02:56
很厉害啊
引用 删除 冰溯   /   2018-03-08 09:02:35
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar