追蹤演算法KCF體驗

hjl240發表於2016-07-23

本文使用KCF的opencv版本實現。

對應論文:High-Speed Tracking with Kernelized Correlation Filters

編譯環境:VS2015 + win7 64位


相關軟體下載安裝

需要下載opencv3.10opencv_contribcmake-gui

圖:opencv下載說明


圖:opencv_contrib下載說明


圖:cmake下載說明


cmake下載的是免安裝版本,解壓縮之後開啟cmake-gui就能直接執行。

將下載的3個檔案安裝/解壓縮。

一.編譯

開啟bin目錄下的cmake-gui.exe。

編譯分為在x86和x64下2中編譯方式,預設是使用x86編譯。

1.      source code路徑選擇opencv3.1下的sources資料夾,build路徑可以自己新建一個資料夾進行存放,如下圖:



2.      開啟Tool---Configure,如果想生成x86下的庫,則選擇Visual Studio 14 2015;如果想生成x64下的庫,則選擇Visual Studio 14 2015 Win64。然後點選Finish。如下圖:


等待一段時間,軟體會自動配置。

 

3.      配置完成後,找到OPENCV_EXTRA_MODULES_PATH,將opencv_contrib的目錄放進去。如下圖,我的opencv_contrib路徑為D:/opencv/opencv_contrib-master/modules



4.      點選Generate,等待配置完成。


Visual Studio 2015編譯

1.      找到之前新建的newBuild目錄,開啟新生成的OpenCV.sln。

2.      在解決方案資源管理器中,選中“解決方案‘OpenCV’”,右鍵-->重新生成解決方案。

3.      依舊是資源管理器中,找到CMakeTargets中的INSTALL,右鍵-->僅用於專案-->僅生成INSTALL。注:想要Debug版(格式為opencv_xxxx310d.lib)的和Release版(格式為opencv_xxxx310.lib)的lib的話,分別選擇Debug和Release以後,生成兩遍就可以了。完成後,D:/OpenCV3.1/sources/newBulid/install下會有很多東西。


配置VS2015

1.      新建win32控制檯專案。




2.      新建cpp原始檔。

3.      配置包含目錄

我的是D:\opencv\opencv310\sources\newBulid\install\include

D:\opencv\opencv310\sources\newBulid\install\include\opencv

D:\opencv\opencv310\sources\newBulid\install\include\opencv2

如下圖:



4.      配置庫目錄

我的是D:\opencv\opencv310\sources\newBulid\install\x86\vc14\lib

D:\opencv\opencv310\sources\newBulid\install\x86\vc14\staticlib

如下圖:



5.      配置依賴項。

由於生成的依賴項太多,要是把每個lib一個一個寫上去,很麻煩,有一種簡便的方法,即,路徑+*.lib,比如我的即為:

D:\opencv\opencv310\sources\newBulid\install\x86\vc14\lib\*.lib

D:\opencv\opencv310\sources\newBulid\install\x86\vc14\staticlib\*.lib

如下圖



6.      以上是win32(x86)Debug配置方法,其他模式(x64、Release)配置方法類似。


測試KCF跟蹤演算法

在上面的工程中新增cpp原始檔,並輸入如下程式碼:

#include <opencv2/core/utility.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <cstring>

using namespace std;
using namespace cv;

int main() {
	// declares all required variables
	//! [vars]
	Rect2d roi;
	Mat frame;
	//! [vars]

	// create a tracker object
	Ptr<Tracker> tracker = Tracker::create("KCF");
	//! [create]

	// set input video
	//! [setvideo]
	std::string video = "E:\\demo1.avi";
	VideoCapture cap(video);
	//! [setvideo]

	// get bounding box
	//! [getframe]
	cap >> frame;
	//! [getframe]
	//! [selectroi]選擇目標roi以GUI的形式
	roi = selectROI("tracker", frame);
	//! [selectroi]

	//quit if ROI was not selected
	if (roi.width == 0 || roi.height == 0)
		return 0;

	// initialize the tracker
	//! [init]
	tracker->init(frame, roi);
	//! [init]

	// perform the tracking process
	printf("Start the tracking process\n");
	for (;; ) {
		// get frame from the video
		cap >> frame;

		// stop the program if no more images
		if (frame.rows == 0 || frame.cols == 0)
			break;

		// update the tracking result
		//! [update]
		tracker->update(frame, roi);
		//! [update]

		//! [visualization]
		// draw the tracked object
		rectangle(frame, roi, Scalar(255, 0, 0), 2, 1);

		// show image with the tracked object
		imshow("tracker", frame);
		//! [visualization]
		//quit on ESC button
		if (waitKey(1) == 27)
			break;
	}

	return 0;
}

注意:修改std::string video ="E:\\demo1.avi";這條語句中的視訊路徑即可。

    執行之後,首先框出物體,然後按下空格或者回車,系統便開始跟蹤

最後效果如下圖:








注:編譯opencv比較麻煩,建議使用這個版本的KCF:https://github.com/hjl240/KCF-Tracking



相關文章