加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

动作捕捉算法

(2007-10-11 13:34:09)
标签:

IT/科技

科学

 视频中Motion Detection(动作捕捉)的一个程序,好文章,翻译一下给大家看看:

http://www.cnblogs.com/images/cnblogs_com/leezjs/motion.jpg

动作捕捉算法
作者:
Andrew Kirillov

一个捕捉视频流中动作的算法:

介绍

捕捉联系视频流中的动作有很多种算法。每种算法都是基于将视频流中当前一帧与前一帧(被看作背景)比较。在本篇文章中,将讨论一些最常用的动作捕捉方法 。

在描述这个算法的时候,我将用到一个图像处理类库 Image Processing Lab in C#. 这是我以前写的。所以,如果你看过那篇文章,那将会有很大的帮助。

本程序支持下面的视频格式:

  • AVI 文件 (用到windows视频,所以要用到interop库);
  • 通过网络照相机不断更新的JPEG图像;
  • 通过网络照相机传输的MJPEG (motion JPEG)流 ;
  • MMS流- Microsoft Media Services;
  • 本机视频捕捉系统(USB照相机、摄像头或其它设备).;

 

算法

在所有的动作捕捉算法中,最常用的是将当前帧与前一帧比较。当你在视频压缩中只需要记录变化,而不是完整的一帧的时候相当的有用, 但他不是动作捕捉的最好方法。所以,接下去我将详细讲述令一个方法。
假设我有一张原始的24 bpp RGB的图像叫做当前帧(图像) ,一个降色调的复制版本(当前帧的)和一个前一帧的降色调复制版本 (背景帧) 。首先,找出两帧图像的不同的regions(区域) 为了达到这个目的,我们可以用DifferenceThreshold 方法过滤。

 

http://www.cnblogs.com/Images/OutliningIndicators/None.gif// create filters
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
Difference differenceFilter = new Difference();
http://www.cnblogs.com/Images/OutliningIndicators/None.gifIFilter thresholdFilter 
= new Threshold(15255);
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
// set backgroud frame as an overlay for difference filter
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
differenceFilter.OverlayImage = backgroundFrame;
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
// apply the filters
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
Bitmap tmp1 = differenceFilter.Apply(currentFrame);
http://www.cnblogs.com/Images/OutliningIndicators/None.gifBitmap tmp2 
= thresholdFilter.Apply(tmp1);


在这个步骤中,我们可以得到一张图片,当前帧与背景帧中不同的地方,都已经被着成白色。现在,已经可以数出两张图上不同像素点的数目。当这个数目大于一个事先定义好的数字时,我们便可以标注为一个动作事件。
但是,大多数相机照出的照片,都有杂点,所以很有可能在没有任何动作的时候,程序会认为有新的动作发生了。要去处照片上随即的杂点(random noisy pixels), 我们可以用一个 Erosion filter 这样,我们可以我们可以得到一个比较真实的结果。


个最简单的动作捕捉器已经搞好了,如果需要的话我们可以让有动作的区域高亮显示。
http://www.cnblogs.com/Images/OutliningIndicators/None.gif// extract red channel from the original image
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
IFilter extrachChannel = new ExtractChannel(RGB.R);
http://www.cnblogs.com/Images/OutliningIndicators/None.gifBitmap redChannel 
= extrachChannel.Apply(image);
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
//  merge red channel with motion regions
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
Merge mergeFilter = new Merge();
http://www.cnblogs.com/Images/OutliningIndicators/None.gifmergeFilter.OverlayImage 
= tmp3;
http://www.cnblogs.com/Images/OutliningIndicators/None.gifBitmap tmp4 
= mergeFilter.Apply(redChannel);
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
// replace red channel in the original image
http://www.cnblogs.com/Images/OutliningIndicators/None.gif
ReplaceChannel replaceChannel = new ReplaceChannel(RGB.R);
http://www.cnblogs.com/Images/OutliningIndicators/None.gifreplaceChannel.ChannelImage 
= tmp4;
http://www.cnblogs.com/Images/OutliningIndicators/None.gifBitmap tmp5 
= replaceChannel.Apply(image);

下面便是结果:

http://www.cnblogs.com/images/cnblogs_com/leezjs/1.jpg

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有