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 <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;
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值