轨迹跟踪——二维轨迹跟踪

本文介绍二维视频跟踪技术,重点讲解VIBE算法的使用和局部搜索平滑处理过程。通过VIBE算法进行去失真和轨迹估计,然后进行局部搜索优化。平滑处理采用基于距离权重的窗口方法。实验结果显示了跟踪效果。作者分享了二次封装后的VIBE类源码,并邀请读者交流讨论和学习。
摘要由CSDN通过智能技术生成

转载请注明原作者t1234xy4:http://blog.csdn.net/t1234xy4/article/details/51241032

在读研期间,由于导师与水环研究生水生物有项目交叉,我主要研究视频跟踪技术。用来提取鱼类的轨迹以及鱼类的微动作。其中鱼类的轨迹提取我已做了两部分工作,二维视频跟踪,提取鱼类的轨迹;另一部分工作是重建三维鱼类游动轨迹。鱼类微特征提取还没有动工(惭愧)。
----------

二维的视频跟踪

在做这项工作之前我们花费了很大的力气去获取实验数据。购买了三个汉邦高科的摄像头,水箱,摄像头支架等。搭建好实验装置。(由于主要说视频跟踪,具体与鱼相关的就带过)
注意:
1、摄像头要固定住,这样拍摄的视频帧才有固定的摄像机坐标,最后才好转换成统一的现实坐标。
2、获取的视频尽量减少运动背景的干扰,熟悉前景检测的人都应该知道。
3、注意光线,不要太暗了,也不要太刺眼,有光圈亮点。

前景跟踪算法过程

首先都是查看文献来着,大概看了20多篇文献资料。其实起指导作用的文献还是只有那么几篇。我就列出来:
[1].Zhang Z.A flexible new technique for camera calibration[J].Transactions on Pattern Analysis and Machine Intelligence,2000(11):1330-1334.
[2]Olivier Barnich, Marc Van Droogenbroeck. ViBe: A universal background subtraction algorithm for video sequences[J]. IEEE Transactions on Image Processing, 20(6):1709-1724, June 2011.
[3]Robust Fragments-based Tracking using the Integral Histogram.
还有很多文献,就不一一列出来了。对我用C++来实现这些算法的启蒙文献应该是文献[3]:
第[3]篇文献:是一种改进的模板匹配方法,把模板和目标都分成多个字块,然后分别匹配,这样可以避免部分被遮挡就丢失目标的情况。(有源码可以查看)
文献[1]很经典,我是直接用的,用来消除摄像头的扭曲形变。
文献[2]是我们方法的基础,我直接将它的源码移植过来了。

我的工作

1、主要是从前景检测的结果中用一种更优的方法找出鱼类所在的位置。能够更加精确、实时的提取鱼类轨迹。
2、将轨迹做平滑处理,使用了基于平方的方法,效果很不错。
3、开发二维轨迹跟踪软件,确实只是小软件,我只用了3个星期不到的时间做完,当然还有很多需要完善的地方。其实也有之前做三维鱼类轨迹跟踪系统的基础。很多复用了之前的代码。

二维估计跟踪算法:
原始帧->去失真->vibe->局部搜索->二维轨迹
vibe算法不是我的原创,是已经很成熟的算法,故不详细说明。贴出它的源码吧,希望大家可以直接借鉴学习。
二次封装之后的vibe.hxx:

#ifndef _VIBE_HXX_
#define _VIBE_HXX_
class VIBE 
{
public:
    VIBE();
    ~VIBE();
    void initialize();
    void update();
    inline void setCurrentFrame( unsigned char* i ) { _image = i; }
    inline void setSegmentMap( unsigned char* i ) { _segMap = i; }

    inline void setFrameWidth( int w ) { _frameWidth = w; }
    inline void setFrameHeight( int h ) { _frameHeight = h; }
    inline void setFrameWidthStrip( int s ) { _frameWidthStrip = s; }

    inline bool isInitilized() { return _samples; }

private:
    int getRandomSample();
    int getRandomSubSample();
    int getRandomNeightXCoordinate( int x );
    int getRandomNeightYCoordinate( 
  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值