----------
注意: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
inline
void setsegmentmap( unsigned
char* i )
inline
void setframewidth( int w )
inline
void setframeheight( int h )
inline
void setframewidthstrip( int s )
inline
bool isinitilized()
private:
int getrandomsample();
int getrandomsubsample();
int getrandomneightxcoordinate( int x );
int getrandomneightycoordinate( int y );
private:
int _framewidth;
int _frameheight;
int _framewidthstrip;
int _sphereradius;
int _pixelsamples;
int _backgroundthreshold;
int _subsampling;
int _borderwidth;
unsigned
char* _image;
unsigned
char* _segmap;
unsigned
char** _samples;
};#endif
#include "stdafx.h"
#include
#include
#include
#include
#include "vibe.hxx"
#define n 25
#define r 15
#define zmin 3
#define phi 16
vibe::vibe()
vibe::~vibe()
delete _samples;
_samples = 0;
}}void vibe::initialize()}}
}void vibe::update()
while( count < _backgroundthreshold && index
< _pixelsamples )
if( count >= _backgroundthreshold )
rand = getrandomsubsample();
//if( rand == 0 )
if( rand
< 6 )
}else}}
}int vibe::getrandomsample()
int vibe::getrandomsubsample()
int vibe::getrandomneightxcoordinate( int
x )int vibe::getrandomneightycoordinate( int
y )
呼叫這個vibe這個類的方法:
vibe vibe;
vibe.setframewidth(image->width);
vibe.setframeheight(image->height);
vibe.setframewidthstrip(segimage->widthstep);
vibe.setsegmentmap( (unsigned char*)(segimage->imagedata));
vibe.setcurrentframe((unsigned char*)grayimage->imagedata);
vibe.initialize();
……//更新
vibe.setcurrentframe( (unsigned char*)grayimage->imagedata );
vibe.update();
不會用多看看類的原始碼吧。「不要怕難,多折騰!」,我導師的名言。
區域性搜尋以及平滑處理
設k為幀數,r為搜尋半徑,p(x,y)為在 (x,y)處的畫素值。設第 幀的座標為(xk,yk) ,可以得到第k+1 幀的位置為 :
平滑處理過程:
設平滑視窗的寬度為w1,視窗中每一幀的權重為:
原理為每一位局當前位置距離的平方,最遠處為1^2,……,當前最大2^k
平滑結果:
效果展示:
vibe結果:
如有疑問,可以聯絡我。
等我的**錄用後,再深入討論三維軌跡跟蹤方法。
matlab,機械臂軌跡規劃,跟蹤軌跡。
clear l1 link 0 0 0 0 0 modified l2 link pi 2 0 70 pi 2 0 modified l3 link 0 20 100 0 modified l4 link pi 70 0 pi 2 modified l5 link 0 0 0 pi 2 0 modi...
軌跡跟蹤主要方法 RocketMQ訊息軌跡 設計篇
rocketmq 訊息軌跡主要包含兩篇文章 設計篇與原始碼分析篇,本節將詳細介紹rocketmq訊息軌跡 設計相關。rocketmq訊息軌跡,主要跟蹤訊息傳送 訊息消費的軌跡,即詳細記錄訊息各個處理環節的日誌,從設計上至少需要解決如下三個核心問題 1 訊息軌跡資料格式 rocketmq4.5版本訊息...
路徑與軌跡 路徑規劃與軌跡規劃 路徑跟蹤與軌跡跟蹤
對於無人車輛來說,全域性路徑點只要包含空間位置資訊即可,也可以包含姿態資訊,而不需要與時間相關,但區域性規劃時,則可以考慮時間資訊。這裡規定軌跡點也是一種路徑點,即當路徑點資訊中加入時間約束,就可以被稱為軌跡點。從這個角度理解,軌跡規劃就是一種路徑規劃,當路徑規劃過程要滿足無人車輛的縱向和橫向動力學...