關於TLD工程在VS2010下運行的修改

一、下面是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);這個函數,至此,程序就可以正常的運行了。但是程序特別慢。還要進行優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章