本人最近在研究跟踪算法,查阅资料得知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的配置,使其可以实现跟踪算法。
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
#include
#include
#include
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 tracker= TrackerMIL::create();
//Ptr tracker= TrackerTLD::create();
Ptr tracker = TrackerKCF::create();
//Ptr tracker = TrackerMedianFlow::create();
//Ptr 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配置成功,同时跟踪算法成功运行。同时可以更换函数来更换不同跟踪算法进行比较与体验。参考上述代码中注释。