• 大小: 11KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2023-11-26
  • 语言: C/C++
  • 标签: opencv  光流法  

资源简介

基于opencv实现,包括特征检测,光流法,图像金字塔实现大运动跟踪

资源截图

代码片段和文件信息

#include “opencv2/opencv.hpp“
#include 
#include 
using namespace std;
using namespace cv;

class frameProcessor;
//帧处理基类
class frameProcessor{
    public:
        virtual void process(Mat &inputMat &ouput)=0;
};

//特征跟踪类,继承自帧处理基类
class FeatureTracker :  public frameProcessor{
    Mat gray;  //当前灰度图
    Mat gray_prev;  //之前的灰度图
    vector points[2];//前后两帧的特征点
    vector initial;//初始特征点
    vector features;//检测到的特征
    int max_count; //要跟踪特征的最大数目
    double qlevel; //特征检测的指标
    double minDist;//特征点之间最小容忍距离
    vector status; //特征跟踪状态
    vector err; //跟踪时的错误
public:
    FeatureTracker():max_count(500)qlevel(0.01)minDist(10.){}
    void process(Mat &frameMat &output){
        //得到灰度图
        cvtColor (framegrayCV_BGR2GRAY);
        frame.copyTo (output);
        //特征点太少了,重新检测特征点
        if(addNewPoint()){
            detectFeaturePoint ();
            //插入检测到的特征点
            points[0].insert (points[0].end ()features.begin ()features.end ());
            initial.insert (initial.end ()features.begin ()features.end ());
        }
        //第一帧
        if(gray_prev.empty ()){
                gray.copyTo (gray_prev);
        }
        //根据前后两帧灰度图估计前一帧特征点在当前帧的位置
        //默认窗口是15*15
        calcOpticalFlowPyrLK (
                gray_prev//前一帧灰度图
                gray//当前帧灰度图
                points[0]//前一帧特征点位置
                points[1]//当前帧特征点位置
                status//特征点被成功跟踪的标志
                err);//前一帧特征点点小区域和当前特征点小区域间的差,根据差的大小可删除那些运动变化剧烈的点
        int k = 0;
        //去除那些未移动的特征点
        for(int i=0;i            if(acceptTrackedPoint (i)){
                initial[k]=initial[i];
                points[1][k++] = points[1][i];
            }
        }
        points[1].resize (k);
        initial.resize (k);
        //标记被跟踪的特征点
        handleTrackedPoint (frameoutput);
        //为下一帧跟踪初始化特征点集和灰度图像
        std::swap(points[1]points[0]);
        cv::swap(gray_prevgray);
    }

    void detectFeaturePoint(){
        goodFeaturesToTrack (gray//图片
                                 features//输出特征点
                                 max_count//特征点最大数目
                                 qlevel//质量指标
                                 minDist);//最小容忍距离
    }
    bool addNewPoint(){
            //若特征点数目少于10,则决定添加特征点
        return points[0].size ()<=10;
    }

    //若特征点在前后两帧移动了,则认为该点是目标点,且可被跟踪
    bool acceptTrackedPoint(int i){
        return status[i]&&
                (abs(points[0][i].x-points[1][i].x)+
                  abs(points[0][i].y-points[1][i].y) >2);
    }

    //画特征点
    void  handleTrackedPoint(Mat &frameMat &output){
            for(int i=0;i                //当前特征点到初始位置用直线表示
                line(outputinitial[i]points[1][i]Scalar::all (0));
                //当前位置用圈标出
                circle(outputpoints[1][i]3Scalar::all(0)(-1));
            }
        }
};


class VideoProcessor{
private:
    VideoCapture caputure

评论

共有 条评论