“常用公式”在线计算,“设计手册”在线查询
动态目标识别属于图像处理。最近很火的是人脸识别或者特征识别,该方向极具实际意义,如在海关检测和犯罪分子识别。下面的识别程序采用MATLAB编写,有大牛的详细注解,想必各位数字图像处理的研究生,急需此类程序。程序经过修改,已经没有问题!希望大家多交流学习!该例子很经典,后面还附有答疑,请多关注!附近里面有视频和程序!

问题一:那是否可以在检测出的运动目标的基础上用肤色模型检测出人脸,调整窗口,以此来进行人脸的跟踪呢?

答:可以的,但肤色得打在脸上!

源程序:


  • clear data
  • disp('input video');
  • avi = aviread('samplevideo.avi'); % 读取视频
  • video = {avi.cdata}; %得到视频中的图像数据
  • % 在figure中播放原始视频(一帧一帧图像连续显示)
  • for a = 1:length(video)
  •     imagesc(video{a});
  •     axis image off
  •     drawnow;
  • end;
  • disp('output video');
  • tracking(video);% 调用目标检测跟踪程序
    • function d=tracking(video)
    • if ischar(video)
    •     % 读取视频如果video,为视频的所在路径.
    •     avi = aviread(video);
    •     pixels = double(cat(4,avi(1:2:end).cdata))/255;
    •     clear avi
    • else
    •     % 直接读取视频中的帧,间隔取帧,得到一个四维的矩阵,里面放的是彩色图像
    •     pixels = double(cat(4,video{1:2:end}))/255;
    •     clear video
    • end
    • % 将每一帧的彩色图像转化为灰度图像
    • nFrames = size(pixels,4);% 帧的数目
    • for f = 1:nFrames
    •     pixel(:,:,f) = (rgb2gray(pixels(:,:,:,f)));
    • end
    • rows=240;
    • cols=320;
    • nrames=f;
    • % 下面就是利用帧间做差发进行运动目标的跟踪
    • for l = 2:nrames
    •     % 后一帧减去前一帧
    •     d(:,:,l)=(abs(pixel(:,:,l)-pixel(:,:,l-1)));
    •     k=d(:,:,l);
    •     bw(:,:,l) = im2bw(k, .2);% 二值化
    •    
    •     bw1=bwlabel(bw(:,:,l)); % 连通标记
    •     imshow(bw(:,:,l)) %显示图像
    •     hold on
    •     cou=1;
    •     % 下面的目的就是得到二值图像中目标的大小,并矩形框出来,连续显示
    •     for h=1:rows
    •      for w=1:cols
    •          if(bw(h,w,l)>0.5)
    •             toplen = h;
    •             if (cou == 1)
    •              tpln=toplen;
    •             end
    •             cou=cou+1;
    •             break
    •          end
    •      end
    •     end
    •     disp(toplen);
    •     coun=1;
    •     for w=1:cols
    •      for h=1:rows
    •          if(bw(h,w,l)>0.5)
    •             leftsi = w;
    •             if (coun == 1)
    •              lftln=leftsi;
    •              coun=coun+1;
    •             end
    •             break
    •          end
    •      end
    •     end
    •     disp(leftsi);
    •     disp(lftln);
    •     widh=leftsi-lftln;
    •     heig=toplen-tpln;
    •     widt=widh/2;
    •     disp(widt);
    •     heit=heig/2;
    •     with=lftln+widt;
    •     heth=tpln+heit;
    •     wth(l)=with;
    •     hth(l)=heth;
    •     disp(heit);
    •     disp(widh);
    •     disp(heig);
    •     rectangle('Position',[lftln tpln widh heig],'EdgeColor','r');
    •     disp(with);
    •     disp(heth);
    •     plot(with,heth, 'r*');
    •     drawnow;
    •     hold off
    • end;
    问题二:



    for l = 2:nrames
        % 后一帧减去前一帧
        d(:,:,l)=(abs(pixel(:,:,l)-pixel(:,:,l-1)));
        k=d(:,:,l);
        bw(:,:,l) = im2bw(k, .2);% 二值化
       
        bw1=bwlabel(bw(:,:,l)); % 连通标记
        imshow(bw(:,:,l)) %显示图像
        hold on
        cou=1;
    其中imshow(bw(:,:,l))显示的是黑白的图像,那请问怎么显示彩色的图像呢?








直接显示就是了……

在将rgb图像转为灰度图像的时候保留一份……
然后在显示的时候将保留的显示就是了……
  • function d=tracking(video)
  • if ischar(video)
  •     % 读取视频如果video,为视频的所在路径.
  •     avi = aviread(video);
  •     pixels = double(cat(4,avi(1:2:end).cdata))/255;
  •     clear avi
  • else
  •     % 直接读取视频中的帧,间隔取帧,得到一个四维的矩阵,里面放的是彩色图像
  •     pixels = double(cat(4,video{1:2:end}))/255;
  •     pixelsrgb = double(cat(4,video{1:2:end}))/255;
  •     clear video
  • end
  • % 将每一帧的彩色图像转化为灰度图像
  • nFrames = size(pixels,4);% 帧的数目
  • for f = 1:nFrames
  •     pixel(:,:,f) = (rgb2gray(pixels(:,:,:,f)));
  • end
  • rows=240;
  • cols=320;
  • nrames=f;
  • % 下面就是利用帧间做差发进行运动目标的跟踪
  • for l = 2:nrames
  •     % 后一帧减去前一帧
  •     d(:,:,l)=(abs(pixel(:,:,l)-pixel(:,:,l-1)));
  •     k=d(:,:,l);
  •     bw(:,:,l) = im2bw(k, .2);% 二值化
  •    
  •     bw1=bwlabel(bw(:,:,l)); % 连通标记
  •     %imshow(bw(:,:,l)) %显示图像
  •     imshow(pixelsrgb(:,:,:,l)); % 显示彩色图像,标出运动……
  •     hold on
  •     cou=1;
  •     % 下面的目的就是得到二值图像中目标的大小,并矩形框出来,连续显示
  •     for h=1:rows
  •      for w=1:cols
  •          if(bw(h,w,l)>0.5)
  •             toplen = h;
  •             if (cou == 1)
  •              tpln=toplen;
  •             end
  •             cou=cou+1;
  •             break
  •          end
  •      end
  •     end
  •     disp(toplen);
  •     coun=1;
  •     for w=1:cols
  •      for h=1:rows
  •          if(bw(h,w,l)>0.5)
  •             leftsi = w;
  •             if (coun == 1)
  •              lftln=leftsi;
  •              coun=coun+1;
  •             end
  •             break
  •          end
  •      end
  •     end
  •     disp(leftsi);
  •     disp(lftln);
  •     widh=leftsi-lftln;
  •     heig=toplen-tpln;
  •     widt=widh/2;
  •     disp(widt);
  •     heit=heig/2;
  •     with=lftln+widt;
  •     heth=tpln+heit;
  •     wth(l)=with;
  •     hth(l)=heth;
  •     disp(heit);
  •     disp(widh);
  •     disp(heig);
  •     rectangle('Position',[lftln tpln widh heig],'EdgeColor','r');
  •     disp(with);
  •     disp(heth);
  •     plot(with,heth, 'r*');
  •     drawnow;
  •     hold off
  • end;

Motion+Detection.rar

!sourceimagesize! 0 Bytes, 下载次数: 0

代码和处理结果!

共 9 个关于本帖的回复 最后回复于 2016-1-7 10:25

曹宇飞 十品草民 发表于 2015-1-14 13:22:49 | 显示全部楼层
研发埠培训中心
资料很详细!谢谢楼主!
曹宇飞 十品草民 发表于 2015-1-14 13:22:52 | 显示全部楼层
研发埠人才中心
资料很详细!谢谢楼主!
谢卫宁 新来的 发表于 2015-1-26 17:07:56 | 显示全部楼层
感谢楼主
安丰贞 编辑 发表于 2015-2-26 10:34:16 | 显示全部楼层
分享是种美德
gobine 九品主簿 发表于 2015-10-11 14:34:27 | 显示全部楼层
gobine 九品主簿 发表于 2015-10-11 14:34:32 | 显示全部楼层
liuzengkun 九品主簿 发表于 2015-10-17 10:24:29 | 显示全部楼层
学习,谢谢分享
西瓜大de籽 九品主簿 发表于 2015-11-23 14:28:49 | 显示全部楼层
谢谢楼主分享
KIGI 八品司务 发表于 2016-1-7 10:25:02 | 显示全部楼层
NARK
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注我们

360网站安全检测平台