扩展模块的目标跟踪算法有:
单目标跟踪 步骤:
1.实例化跟踪器 :Ptr
2.鼠标框选ROL目标:Rect2d roi = selectROI("input", frame);
3.初始化目标:tracker->init(frame, roi);
4.更新目标:tracker->update(frame, roi);
5.画出目标:rectangle(frame, roi, Scalar(255, 0, 0), 2, 8)。
#include
#include
using namespace cv;
using namespace std;
//单目标跟踪
int main(int arc, char** argv) {
VideoCapture capture(0);
//capture.open("vtest.avi");
namedWindow("output", CV_WINDOW_AUTOSIZE);
//扩展模块跟踪器有:TrackerKCF,TrackerMedianFlow,TrackerBoosting,TrackerTLD
//【1】实例化一个跟踪器类
Ptr tracker = TrackerKCF::create();
Mat frame;
capture.read(frame);
capture.read(frame);
Rect2d roi = selectROI("input", frame);
//【2】初始化目标
tracker->init(frame, roi);
while (capture.read(frame)) {
imshow("input", frame);
//【3】更新目标
tracker->update(frame, roi);
rectangle(frame, roi, Scalar(255, 0, 0), 2, 8);
imshow("output", frame);
char c = waitKey(100);
if (c == 27) { break; }
}
waitKey(0);
return 0;
}
多目标跟踪 步骤:
1.实例化跟踪器 :MultiTracker trackers;
2.鼠标框选ROL目标:vector
selectROIs("input", frame, rois, false);
3.传入的边界框数据类型是Rect2d,因为涉及到计算,所以需要double类型,儿框选的ROI是Rect类型的的,需要转换一下;
3.添加目标:trackers.add(algorithms, frame, obj);
4.更新目标:trackers.update(frame, obj);
5.画出目标:rectangle(frame, obj[i] ,Scalar(255, 0, 0), 2, 8)。
#include
#include
using namespace cv;
using namespace std;
int main(int arc, char** argv) {
VideoCapture capture(0);
capture.open("vtest.avi");
namedWindow("input", CV_WINDOW_AUTOSIZE);
namedWindow("output", CV_WINDOW_AUTOSIZE);
//Ptr trackers = MultiTracker::create();
//【1】实例化一个多目标跟踪器的对象
MultiTracker trackers;
Mat frame;
capture.read(frame);
//【2】选择目标
vector rois;
selectROIs("input", frame, rois, false);
//传入的边界框数据类型是Rect2d,因为涉及到计算,所以需要double类型,需要转换一下。
vector obj;
vector> algorithms;
for (auto i = 0; i < rois.size(); i++) {
obj.push_back(rois[i]);
algorithms.push_back(TrackerKCF::create());
}
//【3】添加目标
trackers.add(algorithms, frame, obj);
while (capture.read(frame)) {
imshow("input", frame);
//【4】更新目标
trackers.update(frame, obj);
for (auto j = 0; j < obj.size(); j++) {
rectangle(frame, obj[j], Scalar(255, 0, 0), 2, 1);
}
/*for (auto j = 0; j < trackers.getObjects().size(); j++) {
rectangle(frame, trackers.getObjects()[j], Scalar(255, 0, 0), 2, 1);
}*/
imshow("output", frame);
char c = waitKey(100);
if (c == 27) { break; }
}
waitKey(0);
return 0;