您现在的位置:首页 >> 参考书籍 >> MATLAB >> 内容

人运动交叉识别

时间:2018-2-7 0:01:56 点击:

  核心提示:matlab代做|FPGA代做|simulink代做|matlab专业代做|FPGA专业代做|simulink专业代做 QQ :1224848052 微信:网站首页二维码 邮箱:1224848052@qq.com ...

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

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

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

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

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

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

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

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

                dy(jj,ii) = Yn(jj,ii)-Yn(jj-1,ii);%计算物体形心的差分值

                end   

            end

            for ii=1:2

                %计算形心差分的平均值

                Cx(ii) = mean(dx(:,ii));

                Cy(ii) = mean(dy(:,ii));

                %记录交叉前一帧的形心差分值

                Cx2(ii) = dx(size(dx,1),ii);

                Cy2(ii) = dy(size(dy,1),ii);            

            end

            for ii=1:2

                %预测交叉时刻的形心估计值

                Xn(nseg,ii) = Xn(nseg-1,ii) + Cx(ii);

                Yn(nseg,ii) = Yn(nseg-1,ii) ;  

            end

        end

        %计算估计参考形心值,用来识别交叉分开后原物体的运动方向,防止错误跟踪

        if check_frame>0

            if nobjs >1 & nseg<check_frame

               for ii = 1:2

               %目标标定参考坐标

               Xn_ref(nseg,ii) =sum(B{ii}(:,2))/size(B{ii}(:,2),1);

               Yn_ref(nseg,ii) =sum(B{ii}(:,1))/size(B{ii}(:,1),1);         

               end

            end

            if nseg>=check_frame

                for ii=1:2

                    Xn_ref(nseg,ii) = Xn(nseg-1,ii) + Cx(ii);

                    Yn_ref(nseg,ii) = Yn(nseg-1,ii) ;         

                end           

            end 

        end          

%--物体特征——形心的计算

%--物体特征——形心的计算

%--物体特征——形心的计算

    这里设计到的知识点:物体形心的计算,以及通过形心的坐标进行运动估计的知识点。

人体轮廓:

%第二级显示,人体轮廓

%第二级显示,人体轮廓

%第二级显示,人体轮廓

        jj=0;

        for j=1:nobjs       

            rc=[min(B{j}(:,2)) min(B{j}(:,1)) max(B{j}(:,2))-min(B{j}(:,2)) max(B{j}(:,1))-min(B{j}(:,1))];

            [l_x l_y] = find(L==j);%计算坐标

            cx        = mean(l_x);

            cy        = mean(l_y);

            Area      = size(l_x,1);       

            jj        = jj+1;

    当物体出现交叉的时候,开始计算如下两个值,这两个值用来区分物体的标志,原先方法,如果物体交叉后,就会导致错误标定,通过这个方法就可以跟踪物体的运动。

            if check_frame>0

               check1(nseg) = abs(Xn_ref(nseg,1) - Xn(nseg,1));

               check2(nseg) = abs(Xn_ref(nseg,1) - Xn(nseg,2));  

            end

            %为了计算精度,将形心坐标的差值的平均作为预测增量

            if nobjs == 2

                 if check1 >= check2%物体未交叉

                     if jj == 1

                         figure(1);

                         plot(B{j}(:,2),B{j}(:,1),'g','LineWidth',1);hold on 

                     else

                         figure(1);

                         plot(B{j}(:,2),B{j}(:,1),'r','LineWidth',1);hold on

                     end  

                 else%物体交叉

                     if jj == 1

                         figure(1);

                         plot(B{j}(:,2),B{j}(:,1),'r','LineWidth',1);hold on 

                     else

                         figure(1);

                         plot(B{j}(:,2),B{j}(:,1),'g','LineWidth',1);hold on

                     end  

                 end

            end

            if nobjs == 1

                 plot(B{j}(:,2),B{j}(:,1),'y','LineWidth',1);hold on                

            end 

        end

matlab代做|FPGA代做|simulink代做|matlab专业代做|FPGA专业代做|simulink专业代做
QQ  :1224848052
微信:网站首页二维码
邮箱:1224848052@qq.com 

作者:人运动交叉识别 来源:人运动交叉识别
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • MATLAB代做|MATLAB专业代做|MATLAB淘宝代做(www.hslogic.com) © 2018 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment