跟蹤演算法代碼
1. 計算機視覺中,目前有哪些經典的目標跟蹤演算法
跟蹤是一個很混亂的方向。
比如TLD、CT、Struct這些效果不錯的Tracker其實都不是單純的Tracker了。09年的時候我記得比較流行的是Particle Filtering, 或者一些MeanShift/CamShift的變形,比如特徵變了,比如對問題的假設變了。
後來突然出現一些tracking by detection的方法,之前的很多朋友就覺得這是耍流氓。比如TLD,嚴格的跟蹤演算法也許只是裡面的Forward/Backward Opitcal Flow的部分,但是效果很Impressive,所以不管怎樣,一下就火了。
之後所謂的跟蹤就不再是一個傳統的跟蹤問題,而是一個綜合的工程問題。online learning,random projection ,sparse learning的東西都加進來,大家其實到底是在做跟蹤還是在做檢測或者online learning,其實已經不重要,因為衡量的標準是你在某些public dataset上的精度。
但這些對實際的項目有沒有幫助呢?
這是個很有意思的地方,在很多時候,我們之所以需要跟蹤演算法,是因為我們的檢測演算法很慢,跟蹤很快。基本上當前排名前幾的跟蹤演算法都很難用在這樣的情況下,因為你實際的速度已經太慢了,比如TLD,CT,還有Struct,如果目標超過十個,基本上就炸了。況且還有些跟蹤演算法自己drift掉了也不知道,比如第一版本的CT是無法處理drift的問題的,TLD是可以的,究其原因還是因為檢測演算法比較魯棒啊……
實際中我覺得速度極快,實現也簡單的純跟蹤演算法居然是NCC和Overlap。
NCC很簡單,這個是對點進行的,對於區域也有很多變種,網上有一些相關的資源。
Overlap是我取的名字,一般用在裡面,假如你的攝像頭是靜止的,背景建模之後出來的前景可以是一個一個的blob,對相鄰兩幀的blob檢測是否Overlap就可以得到track。在一些真實場景下,這個演算法是非常有效的。關於背景template的問題在真實的裡面也是很好解決的。
坐在電腦前面調試代碼tuning 各種閾值讓跟蹤演算法在某一個幀下面不要drift的事情我是再也不想幹了。
順祝你2015幸福快樂。
2. 運行opencv里的跟蹤演算法時出現了一個未定義Tracker類的問題
opencv里有個概念叫ROI,regionofinterest,比如你獲得的人臉的矩形框如果是cvRectregion的話,源圖像是img的話,下面的代碼可以實現cvSetImageROI((IplImage*)img,region);//.size.width=region.width;size.height=region.height;m_FaceArea=cvCreateImage(size,IPL_DEPTH_8U,img->nChannels);cvCopy(img,m_FaceArea);//Copyjusttheregion.cvResetImageROI((IplImage*)img);m_FaceArea就是臉的圖像了
3. 如何用c語言編寫跟蹤程序~~以往是用粒子濾波演算法跟蹤
Python break語句,就像在C語言中,打破了最小封閉for或while循環。
break語句用來終止循環語句,即循環條件沒有False條件或者序列還沒被完全遞歸完,也會停止執行循環語句。
break語句用在while和for循環中。
如果您使用嵌套循環,break語句將停止執行最深層的循環,並開始執行下一行代碼。
4. 有了卡爾曼濾波跟蹤演算法程序代碼,在matlab中如何操作才能實現對小球落地動畫中的小球進行跟蹤
作為一個計量學中不太常用的方法,專門介紹的書應該不多吧
在主要的計量學中應該都有涉及,梁逸增白灰黑復雜多組分分析體系及其化學計量學演算法中有演算法介紹,許祿的化學計量學有詳細介紹還有例子,建議參考。
5. 目標檢測與目標追蹤源代碼
大致的思路是:通過背景差或幀差的方法獲取兩者的差別,並通過設定閾值,將差別較大的認為是前景目標,然後通過一些腐蝕、膨脹、濾波(比如中值濾波)提取出前景目標,然後去除小目標減少干擾,並用矩形框將結果框出來,很簡單,自己對照著這個思想好好看看代碼吧,凡是要靠自己努力才能成長。祝學業有成~ void update_mhi( IplImage* img, IplImage* dst, int diff_threshold ) { double timestamp = clock()/1.; CvSize size = cvSize(img->width,img->height); int i, idx1, idx2; IplImage* silh; IplImage* pyr = cvCreateImage( cvSize((size.width & -2)/2, (size.height & -2)/2), 8, 1 ); CvMemStorage *stor; CvSeq *cont; /*先進行數據的初始化*/ if( !mhi || mhi->width != size.width || mhi->height != size.height ) { if( buf == 0 ) { buf = (IplImage**)malloc(N*sizeof(buf[0])); memset( buf, 0, N*sizeof(buf[0])); } for( i = 0; i < N; i++ ) { cvReleaseImage( &buf[i] ); buf[i] = cvCreateImage( size, IPL_DEPTH_8U, 1 ); cvZero( buf[i] ); } cvReleaseImage( &mhi ); mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 ); cvZero( mhi ); } cvCvtColor( img, buf[last], CV_BGR2GRAY ); //前面沒看,我想是將rgb圖像轉為灰度圖像,可能create一下單通道的圖像,存放轉換結果的。
6. 誰有基於協方差矩陣的目標跟蹤演算法的代碼
跟蹤是一個很混亂的方向。
比如TLD、CT、Struct這些效果不錯的Tracker其實都不是單純的Tracker了。09年的時候我記得比較流行的是Particle Filtering, 或者一些MeanShift/CamShift的變形,比如特徵變了,比如對問題的假設變了。
7. 圖像多目標跟蹤演算法MATLAB代碼
這個多目標是什麼 車 人 還是動物之類的 這可是個大問題 一般要先檢測 然後在跟蹤
8. camshift或者mishift 運動目標自動跟蹤的實現
camshift 實現自動化跟蹤的小技巧opencv 提供了使用基於顏色的跟蹤演算法camshift, 很好的演算法,可是它是個半自動的演算法,它需要用戶在跟蹤界面設定跟蹤的目標。怎麼預先設定目標再來跟蹤呢?
本人偷了個懶,加入了用一張圖片來設定跟蹤的目標,在啟動中載入圖片,生成跟蹤需要的histogram。這樣實現了自動化的跟蹤吧。步驟如下:
1. 找到你需要跟蹤的物體,拿到攝像頭前,照一張相(print screen),這里需要注意的是,由於光線變化,臨近攝像頭會亮一些,離遠會暗一些,那麼最好跟蹤的物體的拍攝顏色與實際跟蹤中顏色相近。2. 打開畫筆功能,新建一張圖片(320*240),大小與視頻源圖像一致,把物體截取放大,這樣跟蹤的顏色區域就都在圖像中了。 3。在代碼中加入 void loadTemplateImage()
{
IplImage *tempimage = cvLoadImage("F:/OM_tracking/Test cam shift/ShadowTrack/Debug/green.bmp",1);
cvCvtColor( tempimage, hsv, CV_BGR2HSV );
int _vmin = vmin, _vmax = vmax; cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
cvScalar(180,256,MAX(_vmin,_vmax),0), mask );
cvSplit( hsv, hue, 0, 0, 0 );
selection.x = 1;
selection.y = 1;
selection.width = 320-1;
selection.height= 240-1; cvSetImageROI( hue, selection );
cvSetImageROI( mask, selection );
cvCalcHist( &hue, hist, 0, mask ); float max_val = 0.f;
cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
cvResetImageROI( hue );
cvResetImageROI( mask );
track_window = selection;
track_object = 1; cvReleaseImage(&tempimage);}4,去掉原來的生成Hist的代碼。在啟動時候加入loadTemplateImage5.運行代碼,看結果吧. 代碼這里下載