KCF 跟踪在 opencv3.1 中集成了, 在 opencv_contrib/tracking 中有, opencv_contrib 这个需要重新编译一下 opencv3.1 才能get.windows下的编译方法如下网址
http://blog.csdn.net/yomo127/article/details/50474955
可以在 git 上直接下载也可, 地址如下
https://github.com/Itseez/opencv_contrib
如果你是直接从git下载的, 可以看到关于KCF部分添加的内容如下 (gitlog可)
- /*---------------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/include/opencv2/tracking/tracker.hpp 中关于 kcf 的定义, 多说两句, 这里面定义了很多跟踪的方法, 包括在线跟踪的 MILtracker,OBAtracker, 还有, particle filtering tracker,TLD tracker,KCF tracker, 他们的基类叫做 Tracker, 这个 Tracker 的声明如下:
- class CV_EXPORTS_W Tracker : public virtual Algorithm
- {
- public:
- virtual ~Tracker();
- /** @brief Initialize the tracker with a know bounding box that surrounding the target
- @param image The initial frame
- @param boundingBox The initial boundig box
- @return True if initialization went succesfully, false otherwise
- */
- CV_WRAP bool init( const Mat& image, const Rect2d& boundingBox );
- /** @brief Update the tracker, find the new most likely bounding box for the target
- @param image The current frame
- @param boundingBox The boundig box that represent the new target location, if true was returned, not
- modified otherwise
- @return True means that target was located and false means that tracker cannot locate target in
- current frame. Note, that latter *does not* imply that tracker has failed, maybe target is indeed
- missing from the frame (say, out of sight)
- */
- CV_WRAP bool update( const Mat& image, CV_OUT Rect2d& boundingBox );
- /** @brief Creates a tracker by its name.
- @param trackerType Tracker type
- The following detector types are supported:
- - "MIL" -- TrackerMIL
- - "BOOSTING" -- TrackerBoosting
- */
- CV_WRAP static Ptr<Tracker> create( const String& trackerType );
- virtual void read( const FileNode& fn )=0;
- virtual void write( FileStorage& fs ) const=0;
- Ptr<TrackerModel> getModel()
- {
- return model;
- }
- protected:
- virtual bool initImpl( const Mat& image, const Rect2d& boundingBox ) = 0;
- virtual bool updateImpl( const Mat& image, Rect2d& boundingBox ) = 0;
- bool isInit;
- Ptr<TrackerFeatureSet> featureSet;
- Ptr<TrackerSampler> sampler;
- Ptr<TrackerModel> model;
- };
下面看一下继承了 Tracker 这个 KCFtracker, 这个算法的论文链接在上一篇博客里
- /** @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 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 = (1u << 0),
- CN = (1u << 1),
- CUSTOM = (1u << 2)
- };
- 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
- unsigned int desc_pca; //!< compressed descriptors of TrackerKCF::MODE
- unsigned int desc_npca; //!< non-compressed descriptors of TrackerKCF::MODE
- };
- virtual void setFeatureExtractor(void( * )(const Mat, const Rect, Mat & ), bool pca_func = false);
- /** @brief Constructor
- @param parameters KCF parameters TrackerKCF::Params
- */
- BOILERPLATE_CODE("KCF", TrackerKCF);
- };
好, 上面这些只是介绍了在 opencv 中 KCF 的接口, 下面举一个例子来看看怎么调用
- // 安装配置好 opencv3.1
- #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( ){
- // declares all required variables
- //! [vars]
- Rect2d roi;
- Mat frame;
- //! [vars]
- // create a tracker object
- //! create 这个函数的参数也可以是 - "MIL" -- TrackerMIL
- //! - "BOOSTING" -- TrackerBoosting , 还可以是 "TLD","MEDIANFLOW"
- Ptr<Tracker> tracker = Tracker::create( "KCF" );
- //! [create]
- // set input video
- //! [setvideo]
- std::string video = "test.avi";
- VideoCapture cap(video);
- //! [setvideo]
- // get bounding box
- //! [getframe]
- cap >> frame;
- //! [getframe]
- //! [selectroi] 选择目标roi以GUI的形式
- roi=selectROI("tracker",frame);
- //! [selectroi]
- //quit if ROI was not selected
- if(roi.width==0 || roi.height==0)
- return 0;
- // initialize the tracker
- //! [init]
- tracker->init(frame,roi);
- //! [init]
- // perform the tracking process
- printf("Start the tracking process\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
- //! [update]
- tracker->update(frame,roi);
- //! [update]
- //! [visualization]
- // draw the tracked object
- rectangle( frame, roi, Scalar( 255, 0, 0 ), 2, 1 );
- // show image with the tracked object
- imshow("tracker",frame);
- //! [visualization]
- //quit on ESC button
- if(waitKey(1)==27)
- break;
- }
- return 0;
- }
来源: http://blog.csdn.net/zwlq1314521/article/details/50495436