1. 程式人生 > >OpenCV 3.2 Tracking 物體跟蹤

OpenCV 3.2 Tracking 物體跟蹤

跟蹤就是在連續視訊幀中定位物體,通常的跟蹤演算法包括以下幾類:

1. Dense OpticalFlow 稠密光流

2. Sparse OpticalFlow 稀疏光流 最典型的如KLT演算法(Kanade-Lucas-Tomshi)

3. Kalman Filter

4. Meanshift andCamshift

5. Multiple objecttracking

需要注意跟蹤和識別的區別,通常來說跟蹤可以比識別快很多,且跟蹤失敗了可以找回來。

OpenCV 3以後實現了很多追蹤演算法,都實現在contrib模組中,安裝參考

下面code實現了跟蹤筆記本攝像頭畫面中的固定區域物體,可以選用OpenCV實現的演算法

#include<opencv2/opencv.hpp>

#include<opencv2/tracking.hpp>

usingnamespace std;

usingnamespace cv;

int main(int argc,char** argv){

  // can change to BOOSTING, MIL, KCF (OpenCV 3.1), TLD, MEDIANFLOW, orGOTURN (OpenCV 3.2)

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

  VideoCapture video(0

);

  if(!video.isOpened()){

    cerr << "cannot read video!" << endl;

    return -1;

  }

  Mat frame;

  video.read(frame);

  Rect2d box(270,120, 180, 260);

  tracker->init(frame, box);

  while(video.read(frame)){

    tracker->update(frame, box);

    rectangle(frame, box, Scalar(255,0, 0

), 2, 1);

    imshow("Tracking", frame);

    int k=waitKey(1);

    if(k==27) break;

  }

}

這裡介紹一下使用OpenCV進行目標跟蹤的方法,之前用過一點。opencv中目標跟蹤的一些比較新的方法(比如MIL、KCF、TLD等)都在opencv_contrib庫裡,所以首先你需要安裝它,詳見Opencv3.1.0+opencv_contrib配置及使用SIFT測試 。 
關於tracking這一塊可參考Opencv的官網 Tracking API 、Introduction to OpenCV Tracker 。 
如果只是想要測試下非常簡單,官網都給了例程;要深入瞭解其原理,檢視相關論文即可。關於其效果的話,看你的使用場合和怎麼理解了。 
這裡貼一下我根據例程稍作修改的測試程式。 
原始碼:

#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("dount.avi");
    // 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;
}
#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 Mat frame; // create a tracker object Ptr<Tracker> tracker = Tracker::create( "KCF" ); // set input video std::string video = argv[1]; // 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; }