一、下面是TLD的博客主頁,上面寫了TLD算法的演變和其相關的文章,以及C++代碼下載鏈接
1.1、Tracking-Learning-Detection[Project][OpenTLD/C++ Code]
1.2、下載得到的C++代碼如下所示
其中:
datasets是一些視頻數據;
doc是程序的流程圖進行說明;
include是頭文件;
src是源文件;
parameters.yml是參數文件;
readme是程序運行說明。
二、我們只要用到datasets、include、src、parameters.yml;
下面講述如何在VS2010下創建工程;
2.1、創建一個空的solution(沒有預編譯的控制檯程序)
2.2、首先將include中的文件拷貝放到src的文件夾中;然後將src、datasets、parameters.yml放到solution的工程目錄下,如下所示:
2.3、編譯項目,此時會冒出很多的錯誤,下面一項一項解決;
a、首先將頭文件包含錯誤的全部由include<TLD.h> 改成 include "TLD.h";其他的頭文件包含以此類推;
b、對錯誤
在TLD.h中包含頭文件#include <opencv2/legacy/legacy.hpp>
c、對ceil和floor()函數的錯誤,全部將函數的的輸入參數用float強制轉換爲浮點型;
d、對於round()函數的錯誤,由於vs2010沒有這個函數,所以全部改成cvRound();
f、下面是引用了http://www.myexception.cn/vsts/1130491.html這個人的修改方法;直接複製他的方法
TLD::clusterBB函數中,vs不支持這種動態數組分配。
float L[c-1]; //Level
int nodes[c-1][2];
int belongs[c];
改成指針和動態分配內存
float *L = new float [c-1]; //Level
int **nodes = new int *[c-1];
for(int i = 0; i < 2 ;i ++)
nodes[i] = new int [c-1];
int *belongs = new int [c];
記得在函數末釋放分配的內存
delete [] L;
L = NULL;
for (int i = 0; i < 2; ++i)
{
delete [] nodes[i];
nodes[i] = NULL;
}
delete []nodes;
nodes = NULL;
delete [] belongs;
belongs = NULL;
至此,所以的錯誤就都解決了,但是我們發現這個項目是裏面是先產生一個可執行文件在cmd下來執行。這樣不方便我們調試;
因此我們要修改程序一開始的參數解析函數;
在mian函數前面定義一下函數;
void read_options2(VideoCapture& capture,FileStorage &fs)
{
char* parameterB="datasets//06_car//init.txt";
readBB(parameterB);
gotBB = true;
string videoS = "datasets//06_car//car.mpg";
capture.open(videoS);
fromfile = true;
string parameterP="parameters.yml";
fs.open(parameterP, FileStorage::READ);
/*if (strcmp(argv[i],"-no_tl")==0){
tl = false;
}
if (strcmp(argv[i],"-r")==0){
rep = true;
}*/
}
然後在mian函數中註釋掉read_options(argc,argv,capture,fs);這個函數
而添加上read_options2(capture,fs);這個函數,至此,程序就可以正常的運行了。但是程序特別慢。還要進行優化。