Skip to content
This repository was archived by the owner on Oct 18, 2023. It is now read-only.

Commit a940aa3

Browse files
committed
CSRT and MOSSE tracker from OpenCV 3.4
1 parent d5d94a8 commit a940aa3

File tree

9 files changed

+262
-3
lines changed

9 files changed

+262
-3
lines changed

cc/macros.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ static FF_FUNC_TYPE ff_func = FF_FUNC_TYPE();
111111
#define FF_SETTER_UINT(clazz, name, prop) FF_SETTER(clazz, name, prop, ff_uint)
112112
#define FF_SETTER_NUMBER(clazz, name, prop) FF_SETTER(clazz, name, prop, ff_number)
113113
#define FF_SETTER_BOOL(clazz, name, prop) FF_SETTER(clazz, name, prop, ff_bool)
114+
#define FF_SETTER_STRING(clazz, name, prop) FF_SETTER(clazz, name, prop, ff_string)
114115

115116
#define FF_SETTER_SIMPLE(clazz, name, prop, converter) \
116117
NAN_SETTER(name##Set) { \

cc/modules/tracking/MultiTracker.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ NAN_MODULE_INIT(MultiTracker::Init) {
1919
Nan::SetPrototypeMethod(ctor, "addMEDIANFLOW", MultiTracker::AddMEDIANFLOW);
2020
Nan::SetPrototypeMethod(ctor, "addTLD", MultiTracker::AddTLD);
2121
Nan::SetPrototypeMethod(ctor, "addKCF", MultiTracker::AddKCF);
22+
Nan::SetPrototypeMethod(ctor, "addMOSSE", MultiTracker::AddTLD);
23+
Nan::SetPrototypeMethod(ctor, "addCSRT", MultiTracker::AddKCF);
2224
Nan::SetPrototypeMethod(ctor, "update", MultiTracker::Update);
2325

2426
target->Set(FF_NEW_STRING("MultiTracker"), ctor->GetFunction());
@@ -115,6 +117,32 @@ NAN_METHOD(MultiTracker::Update) {
115117
FF_RETURN(jsRects);
116118
}
117119

120+
NAN_METHOD(MultiTracker::AddMOSSE) {
121+
FF_METHOD_CONTEXT("MultiTracker::AddMOSSE");
122+
FF_ARG_INSTANCE(0, cv::Mat image, Mat::constructor, FF_UNWRAP_MAT_AND_GET);
123+
FF_ARG_INSTANCE(1, cv::Rect2d boundingBox, Rect::constructor, FF_UNWRAP_RECT_AND_GET);
124+
#if CV_MINOR_VERSION > 3
125+
cv::Ptr<cv::Tracker> type = cv::TrackerMOSSE::create();
126+
#else
127+
const std::string type("MOSSE");
128+
#endif
129+
bool ret = FF_UNWRAP(info.This(), MultiTracker)->tracker.add(type, image, boundingBox);
130+
FF_RETURN(Nan::New(ret));
131+
}
132+
133+
NAN_METHOD(MultiTracker::AddCSRT) {
134+
FF_METHOD_CONTEXT("MultiTracker::AddCSRT");
135+
FF_ARG_INSTANCE(0, cv::Mat image, Mat::constructor, FF_UNWRAP_MAT_AND_GET);
136+
FF_ARG_INSTANCE(1, cv::Rect2d boundingBox, Rect::constructor, FF_UNWRAP_RECT_AND_GET);
137+
#if CV_MINOR_VERSION > 3
138+
cv::Ptr<cv::Tracker> type = cv::TrackerCSRT::create();
139+
#else
140+
const std::string type("CSRT");
141+
#endif
142+
bool ret = FF_UNWRAP(info.This(), MultiTracker)->tracker.add(type, image, boundingBox);
143+
FF_RETURN(Nan::New(ret));
144+
}
145+
118146
#endif
119147

120148
#endif

cc/modules/tracking/MultiTracker.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class MultiTracker : public Nan::ObjectWrap {
2020
static NAN_METHOD(AddMEDIANFLOW);
2121
static NAN_METHOD(AddTLD);
2222
static NAN_METHOD(AddKCF);
23+
static NAN_METHOD(AddMOSSE);
24+
static NAN_METHOD(AddCSRT);
2325
static NAN_METHOD(Update);
2426

2527
static Nan::Persistent<v8::FunctionTemplate> constructor;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#ifdef HAVE_TRACKING
2+
3+
#include "TrackerCSRTParams.h"
4+
5+
#if CV_MINOR_VERSION > 3
6+
7+
Nan::Persistent<v8::FunctionTemplate> TrackerCSRTParams::constructor;
8+
9+
NAN_MODULE_INIT(TrackerCSRTParams::Init) {
10+
v8::Local<v8::FunctionTemplate> ctor = Nan::New<v8::FunctionTemplate>(TrackerCSRTParams::New);
11+
v8::Local<v8::ObjectTemplate> instanceTemplate = ctor->InstanceTemplate();
12+
13+
constructor.Reset(ctor);
14+
ctor->SetClassName(FF_NEW_STRING("TrackerCSRTParams"));
15+
instanceTemplate->SetInternalFieldCount(1);
16+
17+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("sigma"), sigmaGet, sigmaSet);
18+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("admm_iterations"), admm_iterationsGet, admm_iterationsSet);
19+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("background_ratio"), background_ratioGet, background_ratioSet);
20+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("cheb_attenuation"), cheb_attenuationGet, cheb_attenuationSet);
21+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("filter_lr"), filter_lrGet, filter_lrSet);
22+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("gsl_sigma"), gsl_sigmaGet, gsl_sigmaSet);
23+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("histogram_bins"), histogram_binsGet, histogram_binsSet);
24+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("histogram_lr"), histogram_lrGet, histogram_lrSet);
25+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("hog_clip"), hog_clipGet, hog_clipSet);
26+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("hog_orientations"), hog_orientationsGet, hog_orientationsSet);
27+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("kaiser_alpha"), kaiser_alphaGet, kaiser_alphaSet);
28+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("num_hog_channels_used"), num_hog_channels_usedGet, num_hog_channels_usedSet);
29+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("number_of_scales"), number_of_scalesGet, number_of_scalesSet);
30+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("padding"), paddingGet, paddingSet);
31+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("psr_threshold "), psr_threshold Get, psr_threshold Set);
32+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("scale_lr"), scale_lrGet, scale_lrSet);
33+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("scale_model_max_area"), scale_model_max_areaGet, scale_model_max_areaSet);
34+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("scale_sigma_factor"), scale_sigma_factorGet, scale_sigma_factorSet);
35+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("scale_step"), scale_stepGet, scale_stepSet);
36+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("template_size"), template_sizeGet, template_sizeSet);
37+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("use_channel_weights"), use_channel_weightsGet, use_channel_weightsSet);
38+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("use_color_names"), use_color_namesGet, use_color_namesSet);
39+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("use_gray"), use_grayGet, use_graySet);
40+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("use_hog"), use_hogGet, use_hogSet);
41+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("use_rgb"), use_rgbGet, use_rgbSet);
42+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("use_segmentation"), use_segmentationGet, use_segmentationSet);
43+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("weights_lr"), weights_lrGet, weights_lrSet);
44+
Nan::SetAccessor(instanceTemplate, FF_NEW_STRING("window_function"), window_functionGet, window_functionSet);
45+
46+
target->Set(FF_NEW_STRING("TrackerCSRTParams"), ctor->GetFunction());
47+
};
48+
49+
NAN_METHOD(TrackerCSRTParams::New) {
50+
FF_ASSERT_CONSTRUCT_CALL(TrackerCSRTParams);
51+
FF_METHOD_CONTEXT("TrackerCSRTParams::New");
52+
TrackerCSRTParams* self = new TrackerCSRTParams();
53+
self->params = cv::TrackerCSRT::Params();
54+
self->Wrap(info.Holder());
55+
FF_RETURN(info.Holder());
56+
};
57+
58+
#endif
59+
60+
#endif
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include "macros.h"
2+
#include <opencv2/tracking.hpp>
3+
4+
#if CV_MINOR_VERSION > 3
5+
6+
#ifndef __FF_TRACKERCSRTPARAMS_H__
7+
#define __FF_TRACKERCSRTPARAMS_H__
8+
9+
class TrackerCSRTParams : public Nan::ObjectWrap {
10+
public:
11+
cv::TrackerCSRT::Params params;
12+
13+
static NAN_MODULE_INIT(Init);
14+
static NAN_METHOD(New);
15+
16+
static FF_GETTER(TrackerCSRTParams, admm_iterationsGet, params.admm_iterations);
17+
static FF_SETTER_INT(TrackerCSRTParams, admm_iterations, params.admm_iterations);
18+
static FF_GETTER(TrackerCSRTParams, background_ratioGet, params.background_ratio);
19+
static FF_SETTER_INT(TrackerCSRTParams, background_ratio, params.background_ratio);
20+
static FF_GETTER(TrackerCSRTParams, cheb_attenuationGet, params.cheb_attenuation);
21+
static FF_SETTER_NUMBER(TrackerCSRTParams, cheb_attenuation, params.cheb_attenuation);
22+
static FF_GETTER(TrackerCSRTParams, filter_lrGet, params.filter_lr);
23+
static FF_SETTER_NUMBER(TrackerCSRTParams, filter_lr, params.filter_lr);
24+
static FF_GETTER(TrackerCSRTParams, gsl_sigmaGet, params.gsl_sigma);
25+
static FF_SETTER_NUMBER(TrackerCSRTParams, gsl_sigma, params.gsl_sigma);
26+
static FF_GETTER(TrackerCSRTParams, histogram_binsGet, params.histogram_bins);
27+
static FF_SETTER_INT(TrackerCSRTParams, histogram_bins, params.histogram_bins);
28+
static FF_GETTER(TrackerCSRTParams, histogram_lrGet, params.histogram_lr);
29+
static FF_SETTER_NUMBER(TrackerCSRTParams, histogram_lr, params.histogram_lr);
30+
static FF_GETTER(TrackerCSRTParams, hog_clipGet, params.hog_clip);
31+
static FF_SETTER_NUMBER(TrackerCSRTParams, hog_clip, params.hog_clip);
32+
static FF_GETTER(TrackerCSRTParams, hog_orientationsGet, params.hog_orientations);
33+
static FF_SETTER_NUMBER(TrackerCSRTParams, hog_orientations, params.hog_orientations);
34+
static FF_GETTER(TrackerCSRTParams, kaiser_alphaGet, params.kaiser_alpha);
35+
static FF_SETTER_NUMBER(TrackerCSRTParams, kaiser_alpha, params.kaiser_alpha);
36+
static FF_GETTER(TrackerCSRTParams, num_hog_channels_usedGet, params.num_hog_channels_used);
37+
static FF_SETTER_INT(TrackerCSRTParams, num_hog_channels_used, params.num_hog_channels_used);
38+
static FF_GETTER(TrackerCSRTParams, number_of_scalesGet, params.number_of_scales);
39+
static FF_SETTER_INT(TrackerCSRTParams, number_of_scales, params.number_of_scales);
40+
static FF_GETTER(TrackerCSRTParams, paddingGet, params.padding);
41+
static FF_SETTER_NUMBER(TrackerCSRTParams, padding, params.padding);
42+
static FF_GETTER(TrackerCSRTParams, psr_threshold Get, params.psr_threshold );
43+
static FF_SETTER_NUMBER(TrackerCSRTParams, psr_threshold , params.psr_threshold );
44+
static FF_GETTER(TrackerCSRTParams, scale_lrGet, params.scale_lr);
45+
static FF_SETTER_NUMBER(TrackerCSRTParams, scale_lr, params.scale_lr);
46+
static FF_GETTER(TrackerCSRTParams, scale_model_max_areaGet, params.scale_model_max_area);
47+
static FF_SETTER_NUMBER(TrackerCSRTParams, scale_model_max_area, params.scale_model_max_area);
48+
static FF_GETTER(TrackerCSRTParams, scale_sigma_factorGet, params.scale_sigma_factor);
49+
static FF_SETTER_NUMBER(TrackerCSRTParams, scale_sigma_factor, params.scale_sigma_factor);
50+
static FF_GETTER(TrackerCSRTParams, scale_stepGet, params.scale_step);
51+
static FF_SETTER_NUMBER(TrackerCSRTParams, scale_step, params.scale_step);
52+
static FF_GETTER(TrackerCSRTParams, template_sizeGet, params.template_size);
53+
static FF_SETTER_NUMBER(TrackerCSRTParams, template_size, params.template_size);
54+
static FF_GETTER(TrackerCSRTParams, use_channel_weightsGet, params.use_channel_weights);
55+
static FF_SETTER_BOOL(TrackerCSRTParams, use_channel_weights, params.use_channel_weights);
56+
static FF_GETTER(TrackerCSRTParams, use_color_namesGet, params.use_color_names);
57+
static FF_SETTER_BOOL(TrackerCSRTParams, use_color_names, params.use_color_names);
58+
static FF_GETTER(TrackerCSRTParams, use_grayGet, params.use_gray);
59+
static FF_SETTER_BOOL(TrackerCSRTParams, use_gray, params.use_gray);
60+
static FF_GETTER(TrackerCSRTParams, use_hogGet, params.use_hog);
61+
static FF_SETTER_BOOL(TrackerCSRTParams, use_hog, params.use_hog);
62+
static FF_GETTER(TrackerCSRTParams, use_rgbGet, params.use_rgb);
63+
static FF_SETTER_BOOL(TrackerCSRTParams, use_rgb, params.use_rgb);
64+
static FF_GETTER(TrackerCSRTParams, use_segmentationGet, params.use_segmentation);
65+
static FF_SETTER_BOOL(TrackerCSRTParams, use_segmentation, params.use_segmentation);
66+
static FF_GETTER(TrackerCSRTParams, weights_lrGet, params.weights_lr);
67+
static FF_SETTER_NUMBER(TrackerCSRTParams, weights_lr, params.weights_lr);
68+
static FF_GETTER(TrackerCSRTParams, window_functionGet, params.window_function);
69+
static FF_SETTER_STRING(TrackerCSRTParams, window_function, params.window_function);
70+
71+
72+
static Nan::Persistent<v8::FunctionTemplate> constructor;
73+
};
74+
75+
#define FF_UNWRAP_TRACKERCSRTPARAMS(obj) FF_UNWRAP(obj, TrackerCSRTParams)
76+
#define FF_UNWRAP_TRACKERCSRTPARAMS_AND_GET(obj) FF_UNWRAP_TRACKERCSRTPARAMS(obj)->params
77+
78+
#endif
79+
80+
#endif
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#ifdef HAVE_TRACKING
2+
3+
#include "TrackerMOSSE.h"
4+
5+
#if CV_MINOR_VERSION > 3
6+
7+
Nan::Persistent<v8::FunctionTemplate> TrackerMOSSE::constructor;
8+
9+
NAN_MODULE_INIT(TrackerMOSSE::Init) {
10+
v8::Local<v8::FunctionTemplate> ctor = Nan::New<v8::FunctionTemplate>(TrackerMOSSE::New);
11+
v8::Local<v8::ObjectTemplate> instanceTemplate = ctor->InstanceTemplate();
12+
13+
Tracker::Init(ctor);
14+
TrackerMOSSEParams::Init(target);
15+
16+
constructor.Reset(ctor);
17+
ctor->SetClassName(FF_NEW_STRING("TrackerMOSSE"));
18+
instanceTemplate->SetInternalFieldCount(1);
19+
20+
target->Set(FF_NEW_STRING("TrackerMOSSE"), ctor->GetFunction());
21+
};
22+
23+
24+
NAN_METHOD(TrackerMOSSE::New) {
25+
FF_ASSERT_CONSTRUCT_CALL(TrackerMOSSE);
26+
FF_METHOD_CONTEXT("TrackerMOSSE::New");
27+
28+
TrackerMOSSE* self = new TrackerMOSSE();
29+
self->tracker = cv::TrackerMOSSE::createTracker(params);
30+
self->Wrap(info.Holder());
31+
FF_RETURN(info.Holder());
32+
};
33+
34+
#endif
35+
36+
#endif
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "../Tracker.h"
2+
3+
#if CV_MINOR_VERSION > 3
4+
5+
#ifndef __FF_TRACKERMOSSE_H__
6+
#define __FF_TRACKERMOSSE_H__
7+
8+
class TrackerMOSSE : public Tracker {
9+
public:
10+
cv::Ptr<cv::TrackerMOSSE> tracker;
11+
12+
static NAN_MODULE_INIT(Init);
13+
static NAN_METHOD(New);
14+
15+
static Nan::Persistent<v8::FunctionTemplate> constructor;
16+
17+
cv::Ptr<cv::Tracker> getTracker() {
18+
return tracker;
19+
}
20+
};
21+
22+
#endif
23+
24+
#endif

cc/modules/tracking/tracking.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
#include "./Trackers/TrackerGOTURN.h"
1616
#endif
1717

18+
#if CV_MINOR_VERSION > 3
19+
#include "./Trackers/TrackerMOSSE.h"
20+
#include "./Trackers/TrackerCSRT.h"
21+
#endif
22+
1823
NAN_MODULE_INIT(Tracking::Init) {
1924
TrackerBoosting::Init(target);
2025
TrackerMedianFlow::Init(target);
@@ -34,6 +39,12 @@ NAN_MODULE_INIT(Tracking::Init) {
3439
#if CV_MINOR_VERSION > 1
3540
TrackerGOTURN::Init(target);
3641
#endif
42+
43+
#if CV_MINOR_VERSION > 3
44+
TrackerMOSSE::Init(target);
45+
TrackerCSRT::Init(target);
46+
#endif
47+
3748
};
3849

3950
#endif

test/tests/modules/tracking/trackerTests.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const expectImplementsMethods = (tracker) => {
1313
expect(tracker).to.have.property('getModel').to.be.a('function');
1414
};
1515

16-
const TrackerTestGenerator = getTestImg => (trackerName) => {
16+
const trackerName = getTestImg => (trackerName) => {
1717
const newTracker = () => new cv[trackerName]();
1818
const newTrackerParams = () => new cv[`${trackerName}Params`]();
1919

@@ -87,7 +87,12 @@ module.exports = () => {
8787
if (cv.version.minor > 1) {
8888
// trackerNames.push('TrackerGOTURN'); TODO: sample goturn.prototxt
8989
}
90-
90+
if (cv.version.minor > 3) {
91+
trackerNames.push('TrackerCSRT');
92+
}
93+
if (cv.version.minor > 3) {
94+
trackerNames.push('TrackerMOSSE');
95+
}
9196
trackerNames.forEach((trackerName) => {
9297
generateTrackerTests(trackerName);
9398
});
@@ -123,14 +128,26 @@ module.exports = () => {
123128
const ret = tracker.addKCF(testImg, new cv.Rect(0, 0, 10, 10));
124129
expect(ret).to.true;
125130
});
131+
132+
it('addCSRT', () => {
133+
const tracker = new cv.MultiTracker();
134+
const ret = tracker.addCSRT(testImg, new cv.Rect(0, 0, 10, 10));
135+
expect(ret).to.true;
136+
});
137+
138+
it('addMOSSE', () => {
139+
const tracker = new cv.MultiTracker();
140+
const ret = tracker.addMOSSE(testImg, new cv.Rect(0, 0, 10, 10));
141+
expect(ret).to.true;
142+
});
126143
});
127144

128145
describe('update', () => {
129146
funcShouldRequireArgs(() => (new cv.MultiTracker()).update());
130147

131148
it('returns bounding box', () => {
132149
const tracker = new cv.MultiTracker();
133-
['addMIL', 'addBOOSTING', 'addMEDIANFLOW', 'addTLD', 'addKCF'].forEach((addMethod) => {
150+
['addMIL', 'addBOOSTING', 'addMEDIANFLOW', 'addTLD', 'addKCF', 'addCSRT', 'addMOSSE'].forEach((addMethod) => {
134151
tracker[addMethod](testImg, new cv.Rect(0, 0, 10, 10));
135152
});
136153
const rects = tracker.update(testImg);

0 commit comments

Comments
 (0)