Skip to content

Commit

Permalink
Merge pull request opencv#1123 from sovrasov:tracker_kcf_conf
Browse files Browse the repository at this point in the history
  • Loading branch information
vpisarev committed May 23, 2017
2 parents 6ffdd0f + 4ae95b6 commit 3e9b1f6
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 121 deletions.
1 change: 1 addition & 0 deletions modules/tracking/include/opencv2/tracking/tracker.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1236,6 +1236,7 @@ class CV_EXPORTS_W TrackerKCF : public Tracker
*/
void write(FileStorage& /*fs*/) const;

double detect_thresh; //!< detection confidence threshold
double sigma; //!< gaussian kernel bandwidth
double lambda; //!< regularization
double interp_factor; //!< linear interpolation factor for adaptation
Expand Down
130 changes: 9 additions & 121 deletions modules/tracking/samples/kcf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,11 @@
#include <opencv2/highgui.hpp>
#include <iostream>
#include <cstring>
#include "samples_utility.hpp"

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){
Expand All @@ -48,9 +30,6 @@ int main( int argc, char** argv ){
return 0;
}

// ROI selector
BoxExtractor box;

// create the tracker
Ptr<Tracker> tracker = TrackerKCF::create();

Expand All @@ -62,7 +41,7 @@ int main( int argc, char** argv ){

// get bounding box
cap >> frame;
Rect2d roi=box.extract("tracker",frame);
Rect2d roi= selectROI("tracker", frame, true, false);

//quit if ROI was not selected
if(roi.width==0 || roi.height==0)
Expand All @@ -82,7 +61,13 @@ int main( int argc, char** argv ){
break;

// update the tracking result
tracker->update(frame,roi);
bool isfound = tracker->update(frame,roi);
if(!isfound)
{
cout << "The target has been lost...\n";
waitKey(0);
return 0;
}

// draw the tracked object
rectangle( frame, roi, Scalar( 255, 0, 0 ), 2, 1 );
Expand All @@ -95,100 +80,3 @@ int main( int argc, char** argv ){
}

}

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;
}
9 changes: 9 additions & 0 deletions modules/tracking/src/trackerKCF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,10 @@ namespace cv{

// extract the maximum response
minMaxLoc( response, &minVal, &maxVal, &minLoc, &maxLoc );
if (maxVal < params.detect_thresh)
{
return false;
}
roi.x+=(maxLoc.x-roi.width/2+1);
roi.y+=(maxLoc.y-roi.height/2+1);
}
Expand Down Expand Up @@ -821,6 +825,7 @@ namespace cv{
* Parameters
*/
TrackerKCF::Params::Params(){
detect_thresh = 0.5;
sigma=0.2;
lambda=0.01;
interp_factor=0.075;
Expand All @@ -841,6 +846,9 @@ namespace cv{
void TrackerKCF::Params::read( const cv::FileNode& fn ){
*this = TrackerKCF::Params();

if (!fn["detect_thresh"].empty())
fn["detect_thresh"] >> detect_thresh;

if (!fn["sigma"].empty())
fn["sigma"] >> sigma;

Expand Down Expand Up @@ -883,6 +891,7 @@ namespace cv{
}

void TrackerKCF::Params::write( cv::FileStorage& fs ) const{
fs << "detect_thresh" << detect_thresh;
fs << "sigma" << sigma;
fs << "lambda" << lambda;
fs << "interp_factor" << interp_factor;
Expand Down

0 comments on commit 3e9b1f6

Please sign in to comment.