Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv_contrib
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv_contrib
Commits
55294f52
Commit
55294f52
authored
Jul 01, 2015
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #245 from kurnianggoro/KCF
Added KCF Tracker Framework
parents
7f4c627e
cce4f7b3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
410 additions
and
0 deletions
+410
-0
[Tutorial] Adding new Tracker Method for dummies
...king/doc/[Tutorial] Adding new Tracker Method for dummies
+135
-0
tracking.bib
modules/tracking/doc/tracking.bib
+26
-0
tracker.hpp
modules/tracking/include/opencv2/tracking/tracker.hpp
+54
-0
kcf.cpp
modules/tracking/samples/kcf.cpp
+194
-0
featureColorName.cpp
modules/tracking/src/featureColorName.cpp
+0
-0
tracker.cpp
modules/tracking/src/tracker.cpp
+1
-0
trackerKCF.cpp
modules/tracking/src/trackerKCF.cpp
+0
-0
No files found.
modules/tracking/doc/[Tutorial] Adding new Tracker Method for dummies
0 → 100644
View file @
55294f52
/*---------------STEP 1---------------------*/
/* modify this file
* opencv2/tracking/tracker.hpp
* and put several lines of snippet similar to
* the following:
*/
/*------------------------------------------*/
class CV_EXPORTS_W TrackerKCF : public Tracker
{
public:
struct CV_EXPORTS Params
{
Params();
void read( const FileNode& /*fn*/ );
void write( FileStorage& /*fs*/ ) const;
};
/** @brief Constructor
@param parameters KCF parameters TrackerKCF::Params
*/
BOILERPLATE_CODE("KCF",TrackerKCF);
};
/*---------------STEP 2---------------------*/
/* modify this file
* src/tracker.cpp
* add one line in function
* Ptr<Tracker> Tracker::create( const String& trackerType )
*/
/*------------------------------------------*/
Ptr<Tracker> Tracker::create( const String& trackerType )
{
BOILERPLATE_CODE("MIL",TrackerMIL);
BOILERPLATE_CODE("BOOSTING",TrackerBoosting);
BOILERPLATE_CODE("MEDIANFLOW",TrackerMedianFlow);
BOILERPLATE_CODE("TLD",TrackerTLD);
BOILERPLATE_CODE("KCF",TrackerKCF); // add this line!
return Ptr<Tracker>();
}
/*---------------STEP 3---------------------*/
/* make a new file and paste the snippet below
* and modify it according to your needs.
* also make sure to put the LICENSE part.
* src/trackerKCF.cpp
*/
/*------------------------------------------*/
/*---------------------------
| TrackerKCFModel
|---------------------------*/
namespace cv{
/**
* \brief Implementation of TrackerModel for MIL algorithm
*/
class TrackerKCFModel : public TrackerModel{
public:
TrackerKCFModel(TrackerKCF::Params /*params*/){}
~TrackerKCFModel(){}
protected:
void modelEstimationImpl( const std::vector<Mat>& responses ){}
void modelUpdateImpl(){}
};
} /* namespace cv */
/*---------------------------
| TrackerKCF
|---------------------------*/
namespace cv{
/*
* Prototype
*/
class TrackerKCFImpl : public TrackerKCF{
public:
TrackerKCFImpl( const TrackerKCF::Params ¶meters = TrackerKCF::Params() );
void read( const FileNode& fn );
void write( FileStorage& fs ) const;
protected:
bool initImpl( const Mat& image, const Rect2d& boundingBox );
bool updateImpl( const Mat& image, Rect2d& boundingBox );
TrackerKCF::Params params;
};
/*
* Constructor
*/
Ptr<TrackerKCF> TrackerKCF::createTracker(const TrackerKCF::Params ¶meters){
return Ptr<TrackerKCFImpl>(new TrackerKCFImpl(parameters));
}
TrackerKCFImpl::TrackerKCFImpl( const TrackerKCF::Params ¶meters ) :
params( parameters )
{
isInit = false;
}
void TrackerKCFImpl::read( const cv::FileNode& fn ){
params.read( fn );
}
void TrackerKCFImpl::write( cv::FileStorage& fs ) const{
params.write( fs );
}
bool TrackerKCFImpl::initImpl( const Mat& image, const Rect2d& boundingBox ){
model=Ptr<TrackerKCFModel>(new TrackerKCFModel(params));
return true;
}
bool TrackerKCFImpl::updateImpl( const Mat& image, Rect2d& boundingBox ){return true;}
/*
* Parameters
*/
TrackerKCF::Params::Params(){
}
void TrackerKCF::Params::read( const cv::FileNode& fn ){
}
void TrackerKCF::Params::write( cv::FileStorage& fs ) const{
}
} /* namespace cv */
modules/tracking/doc/tracking.bib
View file @
55294f52
...
...
@@ -67,3 +67,29 @@
year={2013},
organization={IEEE}
}
@article{KCF,
title = {High-Speed Tracking with Kernelized Correlation Filters},
journal = {Pattern Analysis and Machine Intelligence, IEEE Transactions on},
author = {Henriques, J. F. and Caseiro, R. and Martins, P. and Batista, J.},
year = {2015},
doi = {10.1109/TPAMI.2014.2345390},
}
@inproceedings{KCF_ECCV,
title = {Exploiting the Circulant Structure of Tracking-by-detection with Kernels},
author = {Henriques, J. F. and Caseiro, R. and Martins, P. and Batista, J.},
booktitle = {proceedings of the European Conference on Computer Vision},
year = {2012},
}
@INPROCEEDINGS{KCF_CN,
author={Danelljan, M. and Khan, F.S. and Felsberg, M. and van de Weijer, J.},
booktitle={Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on},
title={Adaptive Color Attributes for Real-Time Visual Tracking},
year={2014},
month={June},
pages={1090-1097},
keywords={computer vision;feature extraction;image colour analysis;image representation;image sequences;adaptive color attributes;benchmark color sequences;color features;color representations;computer vision;image description;real-time visual tracking;tracking-by-detection framework;Color;Computational modeling;Covariance matrices;Image color analysis;Kernel;Target tracking;Visualization;Adaptive Dimensionality Reduction;Appearance Model;Color Features;Visual Tracking},
doi={10.1109/CVPR.2014.143},
}
modules/tracking/include/opencv2/tracking/tracker.hpp
View file @
55294f52
...
...
@@ -1189,6 +1189,60 @@ class CV_EXPORTS_W TrackerTLD : public Tracker
BOILERPLATE_CODE
(
"TLD"
,
TrackerTLD
);
};
/** @brief KCF is a novel tracking framework that utilizes properties of circulant matrix to enhance the processing speed.
* This tracking method is an implementation of @cite KCF_ECCV which is extended to KFC with color-names features (@cite KCF_CN).
* The original paper of KCF is available at <http://home.isr.uc.pt/~henriques/circulant/index.html>
* as well as the matlab implementation. For more information about KCF with color-names features, please refer to
* <http://www.cvl.isy.liu.se/research/objrec/visualtracking/colvistrack/index.html>.
*/
class
CV_EXPORTS_W
TrackerKCF
:
public
Tracker
{
public
:
/**
* \brief Feature type to be used in the tracking grayscale, colornames, compressed color-names
* The modes available now:
- "GRAY" -- Use grayscale values as the feature
- "CN" -- Color-names feature
*/
enum
MODE
{
GRAY
,
CN
,
CN2
};
struct
CV_EXPORTS
Params
{
/**
* \brief Constructor
*/
Params
();
/**
* \brief Read parameters from file, currently unused
*/
void
read
(
const
FileNode
&
/*fn*/
);
/**
* \brief Read parameters from file, currently unused
*/
void
write
(
FileStorage
&
/*fs*/
)
const
;
double
sigma
;
//!< gaussian kernel bandwidth
double
lambda
;
//!< regularization
double
interp_factor
;
//!< linear interpolation factor for adaptation
double
output_sigma_factor
;
//!< spatial bandwidth (proportional to target)
double
pca_learning_rate
;
//!< compression learning rate
bool
resize
;
//!< activate the resize feature to improve the processing speed
bool
split_coeff
;
//!< split the training coefficients into two matrices
bool
wrap_kernel
;
//!< wrap around the kernel values
bool
compress_feature
;
//!< activate the pca method to compress the features
int
max_patch_size
;
//!< threshold for the ROI size
int
compressed_size
;
//!< feature size after compression
MODE
descriptor
;
//!< descriptor type
};
/** @brief Constructor
@param parameters KCF parameters TrackerKCF::Params
*/
BOILERPLATE_CODE
(
"KCF"
,
TrackerKCF
);
};
//! @}
}
/* namespace cv */
...
...
modules/tracking/samples/kcf.cpp
0 → 100644
View file @
55294f52
/*----------------------------------------------
* Usage:
* example_tracking_kcf <video_name>
*
* example:
* example_tracking_kcf Bolt/img/%04.jpg
* example_tracking_kcf faceocc2.webm
*--------------------------------------------------*/
#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
;
class
BoxExtractor
{
public
:
Rect2d
extract
(
Mat
img
);
Rect2d
extract
(
const
std
::
string
&
windowName
,
Mat
img
,
bool
showCrossair
=
true
);
struct
handlerT
{
bool
isDrawing
;
Rect2d
box
;
Mat
image
;
// initializer list
handlerT
()
:
isDrawing
(
false
)
{};
}
params
;
private
:
static
void
mouseHandler
(
int
event
,
int
x
,
int
y
,
int
flags
,
void
*
param
);
void
opencv_mouse_callback
(
int
event
,
int
x
,
int
y
,
int
,
void
*
param
);
};
int
main
(
int
argc
,
char
**
argv
){
// show help
if
(
argc
<
2
){
cout
<<
" Usage: example_tracking_kcf <video_name>
\n
"
" examples:
\n
"
" example_tracking_kcf Bolt/img/%04.jpg
\n
"
" example_tracking_kcf faceocc2.webm
\n
"
<<
endl
;
return
0
;
}
// ROI selector
BoxExtractor
box
;
// create the tracker
Ptr
<
Tracker
>
tracker
=
Tracker
::
create
(
"KCF"
);
// set input video
std
::
string
video
=
argv
[
1
];
VideoCapture
cap
(
video
);
Mat
frame
;
// get bounding box
cap
>>
frame
;
Rect2d
roi
=
box
.
extract
(
"tracker"
,
frame
);
//quit if ROI was not selected
if
(
roi
.
width
==
0
||
roi
.
height
==
0
)
return
0
;
// initialize the tracker
tracker
->
init
(
frame
,
roi
);
// do the tracking
printf
(
"Start the tracking process, press ESC to quit.
\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
tracker
->
update
(
frame
,
roi
);
// draw the tracked object
rectangle
(
frame
,
roi
,
Scalar
(
255
,
0
,
0
),
2
,
1
);
// show image with the tracked object
imshow
(
"tracker"
,
frame
);
//quit on ESC button
if
(
waitKey
(
1
)
==
27
)
break
;
}
}
void
BoxExtractor
::
mouseHandler
(
int
event
,
int
x
,
int
y
,
int
flags
,
void
*
param
){
BoxExtractor
*
self
=
static_cast
<
BoxExtractor
*>
(
param
);
self
->
opencv_mouse_callback
(
event
,
x
,
y
,
flags
,
param
);
}
void
BoxExtractor
::
opencv_mouse_callback
(
int
event
,
int
x
,
int
y
,
int
,
void
*
param
){
handlerT
*
data
=
(
handlerT
*
)
param
;
switch
(
event
){
// update the selected bounding box
case
EVENT_MOUSEMOVE
:
if
(
data
->
isDrawing
){
data
->
box
.
width
=
x
-
data
->
box
.
x
;
data
->
box
.
height
=
y
-
data
->
box
.
y
;
}
break
;
// start to select the bounding box
case
EVENT_LBUTTONDOWN
:
data
->
isDrawing
=
true
;
data
->
box
=
cvRect
(
x
,
y
,
0
,
0
);
break
;
// cleaning up the selected bounding box
case
EVENT_LBUTTONUP
:
data
->
isDrawing
=
false
;
if
(
data
->
box
.
width
<
0
){
data
->
box
.
x
+=
data
->
box
.
width
;
data
->
box
.
width
*=
-
1
;
}
if
(
data
->
box
.
height
<
0
){
data
->
box
.
y
+=
data
->
box
.
height
;
data
->
box
.
height
*=
-
1
;
}
break
;
}
}
Rect2d
BoxExtractor
::
extract
(
Mat
img
){
return
extract
(
"Bounding Box Extractor"
,
img
);
}
Rect2d
BoxExtractor
::
extract
(
const
std
::
string
&
windowName
,
Mat
img
,
bool
showCrossair
){
int
key
=
0
;
// show the image and give feedback to user
imshow
(
windowName
,
img
);
printf
(
"Select an object to track and then press SPACE/BACKSPACE/ENTER button!
\n
"
);
// copy the data, rectangle should be drawn in the fresh image
params
.
image
=
img
.
clone
();
// select the object
setMouseCallback
(
windowName
,
mouseHandler
,
(
void
*
)
&
params
);
// end selection process on SPACE (32) BACKSPACE (27) or ENTER (13)
while
(
!
(
key
==
32
||
key
==
27
||
key
==
13
)){
// draw the selected object
rectangle
(
params
.
image
,
params
.
box
,
Scalar
(
255
,
0
,
0
),
2
,
1
);
// draw cross air in the middle of bounding box
if
(
showCrossair
){
// horizontal line
line
(
params
.
image
,
Point
((
int
)
params
.
box
.
x
,(
int
)(
params
.
box
.
y
+
params
.
box
.
height
/
2
)),
Point
((
int
)(
params
.
box
.
x
+
params
.
box
.
width
),(
int
)(
params
.
box
.
y
+
params
.
box
.
height
/
2
)),
Scalar
(
255
,
0
,
0
),
2
,
1
);
// vertical line
line
(
params
.
image
,
Point
((
int
)(
params
.
box
.
x
+
params
.
box
.
width
/
2
),(
int
)
params
.
box
.
y
),
Point
((
int
)(
params
.
box
.
x
+
params
.
box
.
width
/
2
),(
int
)(
params
.
box
.
y
+
params
.
box
.
height
)),
Scalar
(
255
,
0
,
0
),
2
,
1
);
}
// show the image bouding box
imshow
(
windowName
,
params
.
image
);
// reset the image
params
.
image
=
img
.
clone
();
//get keyboard event
key
=
waitKey
(
1
);
}
return
params
.
box
;
}
modules/tracking/src/featureColorName.cpp
0 → 100644
View file @
55294f52
This diff is collapsed.
Click to expand it.
modules/tracking/src/tracker.cpp
View file @
55294f52
...
...
@@ -110,6 +110,7 @@ Ptr<Tracker> Tracker::create( const String& trackerType )
BOILERPLATE_CODE
(
"BOOSTING"
,
TrackerBoosting
);
BOILERPLATE_CODE
(
"MEDIANFLOW"
,
TrackerMedianFlow
);
BOILERPLATE_CODE
(
"TLD"
,
TrackerTLD
);
BOILERPLATE_CODE
(
"KCF"
,
TrackerKCF
);
return
Ptr
<
Tracker
>
();
}
...
...
modules/tracking/src/trackerKCF.cpp
0 → 100644
View file @
55294f52
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment