4.17.9.1. bytetrack_tracker_controller

针对ByteTrack算法,通过处理检测的结果,实现对目标的跟踪。

4.17.9.1.1. __init__

接口形式:
bytetrack_tracker_controller(int frame_rate = 30,
                        int track_buffer = 30);

参数说明:

  • frame_rate: int

输入参数。用于控制被追踪物体允许消失的最大帧数,数值越大则被追踪物体允许消失的最大帧数越大。

  • track_buffer: int

输入参数。用于控制被追踪物体允许消失的最大帧数,数值越大则被追踪物体允许消失的最大帧数越大。

4.17.9.1.2. process

处理接口。

接口形式1:
int process(const vector<DeteObjRect>& detected_objects,
        vector<TrackObjRect>& tracked_objects);

参数说明1:

  • detected_objects: vector<DeteObjRect>

输入参数。检测出的物体框。

  • tracked_objects: vector<TrackObjRect>

输出参数。被跟踪的物体。

返回值说明:

int

成功返回0,失败返回其他。

示例代码:
#include <sail/cvwrapper.h>
#include "yolov5.h"// The example code relies on sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv/yolov5.h
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>

using namespace std;
using namespace cv;

class YOLOv5Arg {
public:
    string bmodel;
    int dev_id;
    float conf_thresh;
    float nms_thresh;

    YOLOv5Arg(string bmodel, int dev_id, float conf_thresh, float nms_thresh) {
        this->bmodel = bmodel;
        this->dev_id = dev_id;
        this->conf_thresh = conf_thresh;
        this->nms_thresh = nms_thresh;
    }
};

int main() {
    string input = "datasets/test_car_person_1080P.mp4";
    string bmodel = "models/BM1684X/yolov5s_v6.1_3output_int8_1b.bmodel";
    int dev_id = 0;
    float conf = 0.4;
    float nms = 0.7;
    YOLOv5Arg yolov5_args(bmodel, dev_id, conf, nms);
    YOLOv5 yolov5(yolov5_args);

    VideoCapture cap(input);
    vector<Mat> img_batch;
    BytetrackTrackerController btt;
    vector<vector<float>> track_res_all;

    for (int i = 0; i < 50; i++) {
        Mat img;
        cap.read(img);
        if (img.empty()) {
            break;
        }
        img_batch.push_back(img);
        vector<vector<float>> results = yolov5.process(img_batch);
        vector<vector<float>> det = results[0];
        for (auto& row : det) {
            swap(row[4], row[5]);
        }
        img_batch.clear();
        vector<tuple<int, int, int, int, int, float, int>> det_tuple;
        for (auto& row : det) {
            det_tuple.push_back(make_tuple(static_cast<int>(row[0]), static_cast<int>(row[1]), static_cast<int>(row[2]), static_cast<int>(row[3]), static_cast<int>(row[4]), row[5], static_cast<int>(row[6])));
        }
        vector<vector<float>> track_res = btt.process(det_tuple);
        track_res_all.push_back(track_res);
    }
    cap.release();
    return 0;
}