SortTracker稳定追踪算法

        此算法为基于Hungarian算法和KalmanTracker算法所实现的稳定追踪算法。算法需要依赖opencv库,请确保安装opencv库并正确引入所需头文件。使用时请包含头文件./include/SortTracker.hpp,以及opencv库文件。源文件为./src/SortTracker.cpp

调用接口

算法整体包含在命名空间trk中,追踪接口为SortTracker类中的

list<TrackingBox> SortTracking(vector<TrackingInput>& inputs)

函数。输入为vector<TrackingInput>& inputs,代表需要跟踪的1帧中的目标数据。数组内部为TrackingInput结构体,记录了每一帧中识别的目标。结构内容如下文代码所示。内部变量成员_frame,_obj_id,_classes,_confidence,_box,分别代表帧编号(处理的哪一帧),目标id(识别的目标id),类别(检测目标类别),置信度,矩形框坐标(左上角坐标与矩形框的宽和高)。

struct TrackingInput //输入结构体
{
    int _frame=0;//帧编号
    int _obj_id=0;//帧目标id
    int _classes=0;//类别 0 or 1 
    float _confidence=0.0;//置信度 
    Rect_<float> _box;//矩形框左上角坐标与矩形框的宽和高
};

输出为list<TrackingBox>,代表一帧追踪后的结果,内部为TrackingBox结构体,表示每一个追踪目标的状态。结构体内容如代码下所示。内部成员包含_obj_id,_classes,_continuous,_disappear,_confidence,_box,分别代表追踪后的目标id,目标类别,连续命中帧数,连续消失帧数,置信度,目标矩形框的坐标(左上角坐标与矩形框的宽和高)。

struct TrackingBox //输出结构体
{
    int _obj_id=0;//目标id
    int _classes=0;//类别 0 or 1
    int _continuous=0;//连续命中几帧--kalman更新次数
    int _disappear=0;//连续消失几帧
    float _confidence=0.0;//置信度
    Rect_<float> _box;//矩形框左上角坐标与矩形框的宽和高
};

调用时采用SortTracker对象进行调用,创建SortTracker对象时可指定限制参数iou,max_age,min_hit,min_confidence分别代表交并比阈值,最大连续消失帧数阈值,最小连续命中帧数阈值,最小跟踪置信度阈值。iou的大小将影响内部预测框与检测框的重叠质量,越大则代表重叠质量越低。max_age表示跟踪对象在消失max_age帧后就不再追踪。min_hit表示对象只有连续命中min_hit帧后才被追踪输出。不指定参数具体数值将使用默认参数,追踪对象在连续消失3帧时被删除追踪,命中一帧就会追踪显示。最小置信度参数将保证只有大于最小置信度阈值的检测框才会进行稳定追踪。函数代码如下所示。

SortTracker(double iou=0.3,int max_age=3,int min_hit=0,float min_confidence=0.0)
:_iouThreshold(iou)
,_max_age(max_age)
,_min_hit(min_hit)
,_min_confidence(min_confidence)
{}

调用示例

下面代码为SortTracker的调用示例,代码将从输入文档testdata.txt中读取一行行的帧数据,并将数据按照帧号进行分组,填充到vector<vector<TrackingInput>> detFrameData中,其中每一行都代表一个需要追踪的帧。调用SortTracker实例对象st内部的SortTracking函数进行追踪,并将追踪结果list<TrackingBox> output写入输出文档test_output.txt。

void test1()
{
    cout <<"test SortTracking...." << endl;
    string filename = "./testdata.txt";//读取文件
    string outfile = "test_output.txt";//输出文件
    ifstream testfile;
    testfile.open(filename);
    ofstream resultfile;
    resultfile.open(outfile);
    if(!testfile.is_open())
    {
        cerr << "Error: can not find file " << filename << endl;
        return;
    }
    if (!resultfile.is_open())
    {
        cerr << "Error: can not create file " << outfile << endl;
        return;
    }
    //读取数据并将数据按照帧号进行分组
    string detLine;
    vector<TrackingInput> detData;
    while ( getline(testfile, detLine) )
    {
        istringstream ss;
        ss.str(detLine);
        TrackingInput tb;
        char ch;
        float tpx, tpy, tpw, tph, confidence;
        ss >> tb._frame >> ch >> tb._obj_id >> ch;
        ss >> tpx >> ch >> tpy >> ch >> tpw >> ch >> tph>>ch;
        ss >> confidence >> ch >> tb._classes;
        tb._confidence = confidence;
        ss.str("");
        tb._box = Rect_<float>(Point_<float>(tpx, tpy), Point_<float>(tpx + tpw, tpy + tph));//采用矩形框左上角和右下角坐标进行构建
        detData.push_back(tb);
    }
    testfile.close();
    int maxFrame = 0; //最大的帧分组数
    for (auto tb : detData) // find max frame number
    {
        //cout<<tb._frame<<endl;
        if (maxFrame < tb._frame)
            maxFrame = tb._frame;
    }
    vector<vector<TrackingInput>> detFrameData;
    vector<TrackingInput> tempVec;
    for (int fi = 0
  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingbing~bang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值