本人最近在研究跟蹤算法,查閱資料得知Opencv 3自帶跟蹤算法,內建在opencv_contrib庫中,需要從GitHub下載下傳,然後利用源碼編譯。于是本人嘗試了一下,發現編譯及配置過程不僅花費時間很長(前後大概4個小時),而且容易出錯。本人想直接下載下傳網上編譯好的install檔案進行配置,發現大部分都需要積分。是以無奈自己編譯,經曆一番配置,最終成功測試跟蹤算法。
為了友善同樣在研究跟蹤算法的博友,在此特地分享自己cmake過,且在VS 2017環境下編譯成功的install檔案(同時包括Debug以及Release的依賴庫)的百度雲連結,友善大家下載下傳且配置。
百度雲連結為:https://pan.baidu.com/s/1JSn2rnaDE1ENk-JF21Bcag 提取碼:f0c9
接下來分享在下載下傳好install檔案之後對VS 2017+Opencv3.4.1+opencv_contrib3.4.1的配置,使其可以實作跟蹤算法。
OpenCV+opencv_contrib配置
1.首先将OpenCV庫路徑(D:\OpenCV3.4.1\opencv-3.4.1build\install\x64\vc15\bin)增加的系統環境變量Path中。
注意:本人的路徑可能和你的不同,本人的檔案都是在install目錄,但是你從百度雲下載下傳的檔案是被我重新命名的opencv3.4.1+opencv_contrib3.4.1,不過内容是一緻的。是以需要添加你自己的庫路徑(\x64\vc15\bin)。
1.1 找到如下路徑,然後複制該路徑。

1.2 按下述步驟将上述位址添加到環境變量。
注意:每次更改環境變量後重新開機電腦方能有效。
2.打開Visual Studio 2017,建立一個空項目,然後建立一個空的C++檔案。
2.1首先建立一個空項目。檔案->建立->項目->空項目或者使用快捷鍵crtl+shift+N,選擇名稱和路徑後,點選确定。出現如下界面
該視圖是在解決方案資料總管下才能看到的,如果沒打開,可在最上面工具欄中選擇視圖->解決方案資料總管打開
2.2 在源檔案中添加C++檔案,右鍵源檔案->添加->建立項->C++檔案->添加或者直接快捷鍵crtl+shift+A,如下
3.然後打開屬性管理器。視圖->其他視窗->屬性管理器
4.打開屬性視窗。右鍵Debug|x64->屬性。
5.為工程配置包含目錄,把OpenCV的如下三個目錄增加到VC++的包含目錄屬性清單中。
(1)D:\OpenCV3.4.1\opencv-3.4.1build\install\include
(2)D:\OpenCV3.4.1\opencv-3.4.1build\install\include\opencv
(3)D:\OpenCV3.4.1\opencv-3.4.1build\install\include\opencv2
6.然後按照同樣的添加方式将OpenCV庫目錄添加到VC++目錄的“庫目錄”中。
D:\OpenCV3.4.1\opencv-3.4.1build\install\x64\vc15\lib
7.添加openCV的附加依賴庫到連結器->輸入->附加依賴項.添加後界面如圖。
在Debug模式下添加"opencv_world340d.lib"以及"opencv_img_hash341d.lib"
在Release模式下田間“opencv_world340.lib"以及"opencv_img_hash341.lib"
(Release模式就是上述第4步,右鍵Release|x64,之後其他步驟都一樣)
注意:上述兩種模式隻能選擇一種模式編譯,此處我們使用Debug模式。
8.接下來很重要的一步,打開Debug|x64,右鍵其下面的Microsoft.Cpp.x64.user,然後點選儲存Microsoft.Cpp.x64.user。這樣下次建立工程項目時便自動調用了該設定,不需要再次配置。如圖。
9.到此,我們就完成了一次性在Visual Studio 2017配置OpenCV3.4.1+opencv_contrib3.4.1,實作永久有效。然後重新開機電腦,重新開機VS 2017,配置成功。
跟蹤算法體驗
為了體驗跟蹤算法,我們打開剛剛建立的項目。在C++檔案中寫入如下代碼。
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/tracking/tracker.hpp>
using namespace cv;
void draw_rectangle(int event, int x, int y, int flags, void*);
Mat firstFrame;
Point previousPoint, currentPoint;
Rect2d bbox;
int main(int argc, char *argv[])
{
//啟用攝像頭進行跟蹤
VideoCapture capture(0);
Mat frame;
capture >> frame;
//使用事先錄好的視訊進行檢驗
//VideoCapture capture;
//frame = capture.open("E:\\imagelib\\1.avi");
if(!capture.isOpened())
{
printf("can not open ...\n");
return -1;
} //擷取視訊的第一幀,并框選目标
capture.read(firstFrame);
if(!firstFrame.empty())
{
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", firstFrame);
setMouseCallback("output", draw_rectangle, 0);
waitKey();
}
//使用不同跟蹤算法進行跟蹤
//Ptr<TrackerMIL> tracker= TrackerMIL::create();
//Ptr<TrackerTLD> tracker= TrackerTLD::create();
Ptr<TrackerKCF> tracker = TrackerKCF::create();
//Ptr<TrackerMedianFlow> tracker = TrackerMedianFlow::create();
//Ptr<TrackerBoosting> tracker= TrackerBoosting::create();
capture.read(frame);
tracker->init(frame,bbox);
namedWindow("output", WINDOW_AUTOSIZE);
while (capture.read(frame))
{
tracker->update(frame,bbox);
rectangle(frame,bbox, Scalar(255, 0, 0), 2, 1);
imshow("output", frame);
if(waitKey(20)=='q') return 0;
}
capture.release();
destroyWindow("output"); return 0;
} //框選目标
void draw_rectangle(int event, int x, int y, int flags, void*)
{
if (event == EVENT_LBUTTONDOWN) { previousPoint = Point(x, y); }
else if (event == EVENT_MOUSEMOVE && (flags&EVENT_FLAG_LBUTTON))
{
Mat tmp; firstFrame.copyTo(tmp);
currentPoint = Point(x, y);
rectangle(tmp, previousPoint, currentPoint, Scalar(0, 255, 0, 0), 1, 8, 0);
imshow("output", tmp);
}
else if (event == EVENT_LBUTTONUP)
{
bbox.x = previousPoint.x;
bbox.y = previousPoint.y;
bbox.width = abs(previousPoint.x-currentPoint.x);
bbox.height = abs(previousPoint.y-currentPoint.y);
}
else if (event == EVENT_RBUTTONUP) { destroyWindow("output");
}
}
運作後,會打開攝像頭,然後檢測到第一幀圖檔。然後可以利用滑鼠框選所要跟蹤區域,右鍵确定。然後螢幕會出現一個藍色的方框,跟蹤框選區域。可聚焦圖像視窗,按q鍵退出跟蹤。
KCF算法運作結果如下:
1.第一幀圖像,框選跟蹤區域。
2.跟蹤過程:
見到如上現象,說明VS+OpenCV3.4.1+opencv_contrib3.4.1配置成功,同時跟蹤算法成功運作。同時可以更換函數來更換不同跟蹤算法進行比較與體驗。參考上述代碼中注釋。