Introduction to OpenCV Tracker

目标

通过这篇文章将会了解一下知识:
●创建tracker对象
●使用roiSelector函数的功能,从指定的图像中选择ROI
●在图像中跟踪特定的区域

代码

#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;
int main( int argc, char** argv ){
  // show help
  if(argc<2){
    cout<<
      " Usage: tracker <video_name>\n"
      " examples:\n"
      " example_tracking_kcf Bolt/img/%04d.jpg\n"
      " example_tracking_kcf faceocc2.webm\n"
      << endl;
    return 0;
  }
  // declares all required variables
  Rect2d roi;
  Mat frame;
  // create a tracker object
  Ptr<Tracker> tracker = Tracker::create( "KCF" );
  // set input video
  std::string video = argv[1];
  VideoCapture cap(video);
  // get bounding box
  cap >> frame;
  roi=selectROI("tracker",frame);
  //quit if ROI was not selected
  if(roi.width==0 || roi.height==0)
    return 0;
  // initialize the tracker
  tracker->init(frame,roi);
  // perform the tracking process
  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;
  }
  return 0;
}

解析

1. 设置输入视频

  if(argc<2){
    cout<<
      " Usage: tracker <video_name>\n"
      " examples:\n"
      " example_tracking_kcf Bolt/img/%04d.jpg\n"
      " example_tracking_kcf faceocc2.webm\n"
      << endl;
    return 0;

在该程序中,可以将视频或者多个图像作为程序的输入。如help,应将视频作为输入,如果要将图像列表作为输入,则图像的格式要用4位数字编号(例如文件命名将为0001.jpg,0002.jpg等)。
视频可在 https://github.com/Itseez/opencv_extra/tree/master/testdata/cv/tracking 里寻找。

2.声明需要的变量

  Rect2d roi;
  Mat frame;

roi:记录跟踪对象的边界框,值通过tracker进行更新。
frame:保存输入的视频或图像列表的每一帧图像信息。

3.创建跟踪对象

 Ptr<Tracker> tracker = Tracker::create( "KCF" );

有5种跟踪算法可以选择:

  • MIL
  • BOOSTING
  • MEDIANFLOW
  • TLD
  • KCF

每种算法都有各自的优势和劣势,请参照文档tracker了解更多的信息。

4.选择跟踪目标

 roi=selectROI("tracker",frame);

selectROI功能:通过GUI选择跟踪对象的边界框,默认的参数是从框的中心点开始,并在中间显示十字。更多信息请参考cv::selectROI

5.跟踪目标初始化

 tracker->init(frame,roi);

对tracker进行初始化,检查跟踪边框的大小是否无效,避免初始化过程失败。

6.跟踪目标更新

tracker->update(frame,roi);

执行物体跟踪,并将结果传给roi。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页