Opencv跟踪算法多线程共同使用,最终使用中值得到跟踪框

这里写自定义目录标题

Opencv跟踪算法综合

本文主要实现opencv 自带跟踪算法多线程共同计算而产生最终的跟踪结果
(基于opencv342测试 opencv3 vs各版本下载地址: 链接: https://pan.baidu.com/s/1f5oAFqs-u15vkD5LNTcxtw 提取码: 2qj9)
多目标多线程更新的也发布了 地址:https://blog.csdn.net/weixin_37918890/article/details/107091504

结果示例:
在这里插入图片描述
代码:


#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/core/ocl.hpp>
#include <thread>
using namespace cv;
using namespace std;

bool ok_BOOSTING =false;
bool ok_KCF = false;
bool ok_TLD = false;
bool ok_MEDIANFLOW = false;
bool ok_CSRT = false;

void BOOSTING_tracker(Ptr<Tracker>* tracker,Mat* frame, Rect2d *bbox) {
   
    ok_BOOSTING = (*tracker)->update(*frame, *bbox);
}


void KCF_tracker(Ptr<Tracker>* tracker, Mat* frame, Rect2d* bbox) {

    ok_KCF = (*tracker)->update(*frame, *bbox);
}
void TLD_tracker(Ptr<Tracker>* tracker, Mat* frame, Rect2d* bbox) {

    ok_TLD = (*tracker)->update(*frame, *bbox);
}
void MEDIANFLOW_tracker(Ptr<Tracker>* tracker, Mat* frame, Rect2d* bbox) {
    ok_MEDIANFLOW = (*tracker)->update(*frame, *bbox);

}
void CSRT_tracker(Ptr<Tracker>* tracker, Mat* frame, Rect2d* bbox) {

    ok_CSRT = (*tracker)->update(*frame, *bbox);
}


int main(int argc, char** argv)
{
    // List of tracker types in OpenCV 3.2

    //初始化六个跟踪器
    Ptr<Tracker> trackerBOOSTING;
    trackerBOOSTING = TrackerBoosting::create();
    Ptr<Tracker> trackerMIL;
    trackerMIL = TrackerMIL::create();
    Ptr<Tracker> trackerKCF;
    trackerKCF = TrackerKCF::create();
    Ptr<Tracker> trackerTLD;
    trackerTLD = TrackerTLD::create();
    Ptr<Tracker> trackerMEDIANFLOW;
    trackerMEDIANFLOW = TrackerMedianFlow::create();
    Ptr<Tracker> trackerCSRT;
    trackerCSRT = TrackerCSRT::create();

    //读取视频
    VideoCapture video("D:/testinput/fish6.mp4");
    if (!video.isOpened())
    {
        cout << "Could not read video file" << endl;
        return 1;

    }
    Mat frame;
    bool ok = video.read(frame);
    
    Rect2d bbox(287, 23, 86, 320);
    bbox = selectROI(frame, false);
    rectangle(frame, bbox, Scalar(255, 0, 0), 2, 1);
    Rect2d bboxBOOSTING;
    bboxBOOSTING = bbox;
    Rect2d bboxMIL;
    bboxMIL = bbox;
    Rect2d bboxKCF;
    bboxKCF = bbox;
    Rect2d bboxTLD;
    bboxTLD = bbox;
    Rect2d bboxMEDIANFLOW;
    bboxMEDIANFLOW = bbox;
    Rect2d bboxCSRT;
    bboxCSRT = bbox;


    //初始化六个跟踪器
    trackerBOOSTING->init(frame, bboxBOOSTING);
    trackerMIL->init(frame, bboxMIL);
    trackerKCF->init(frame, bboxKCF);
    trackerTLD->init(frame, bboxTLD);
    trackerMEDIANFLOW->init(frame, bboxMEDIANFLOW);
    trackerCSRT->init(frame, bboxCSRT);
    vector<thread> TrackerThread_;

    while (video.read(frame))
    {
        double timer = (double)getTickCount();
        TrackerThread_.push_back(thread(BOOSTING_tracker, &trackerBOOSTING, &frame, &bboxBOOSTING));
        TrackerThread_.push_back(thread(KCF_tracker, &trackerKCF, &frame, &bboxKCF));
        TrackerThread_.push_back(thread(TLD_tracker, &trackerTLD, &frame, &bboxTLD));
        TrackerThread_.push_back(thread(MEDIANFLOW_tracker, &trackerMEDIANFLOW, &frame, &bboxMEDIANFLOW));
        TrackerThread_.push_back(thread(CSRT_tracker, &trackerCSRT, &frame, &bboxCSRT));
        bool ok_MIL = trackerMIL->update(frame, bboxMIL);
        for (auto& ite : TrackerThread_) {
            ite.join();
        }
        TrackerThread_.clear();
        
        
        float fps = getTickFrequency() / ((double)getTickCount() - timer);
        vector<Rect2d> BBoxs;
        if (ok_BOOSTING)
        {
            BBoxs.push_back(bboxBOOSTING);
        }
        if (ok_KCF)
        {
            BBoxs.push_back(bboxKCF);
        }
        if (ok_TLD)
        {
            BBoxs.push_back(bboxTLD);
        }
        if (ok_MEDIANFLOW)
        {
            BBoxs.push_back(bboxMEDIANFLOW);
        }
        if (ok_CSRT)
        {
            BBoxs.push_back(bboxCSRT);
        }
        if (ok_MIL)
        {
            BBoxs.push_back(bboxMIL);
        }
        vector<int> xs; 
        vector<int> ys;
        vector<int> ws;
        vector<int> hs;

        int size_used = BBoxs.size();
        int xtotal = 0,ytotal=0,wtotal=0,htotal=0;
        for (int index = 0; index < size_used; index++) {
            xs.push_back(BBoxs[index].x);
            ys.push_back(BBoxs[index].y);
            ws.push_back(BBoxs[index].width);
            hs.push_back(BBoxs[index].height);
            xtotal = xtotal + BBoxs[index].x;
            ytotal = ytotal + BBoxs[index].y;
            wtotal = wtotal + BBoxs[index].width;
            htotal = htotal + BBoxs[index].height;
        }
        xtotal = xtotal / size_used;
        ytotal = ytotal / size_used;
        wtotal = wtotal / size_used;
        htotal = htotal / size_used;
        sort(xs.begin(), xs.end());
        sort(ys.begin(), ys.end());
        sort(ws.begin(), ws.end());
        sort(hs.begin(), hs.end());
        int new_i;
        new_i = size_used / 2;
        Rect2d newbox(xs[new_i],ys[new_i], ws[new_i], hs[new_i]);
        //Rect2d newbox(xtotal, ytotal, wtotal, htotal);

        Mat frame_src = frame.clone();
        cout << "size_used:" << size_used << endl;
        if (size_used>0)
        {
            // Tracking success : Draw the tracked object
            rectangle(frame, newbox, Scalar(255, 0, 0), 2, 1);
        }
        else
        {
            // Tracking failure detected.
            putText(frame, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);
        }

        // Display tracker type on frame
        putText(frame, "TEST_fish Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);

        // Display FPS on frame
        putText(frame, "FPS : " + to_string((int(fps))), Point(100, 50), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);

        // Display frame.
        imshow("TEST_fish Tracking", frame);

        Mat frameBOOSTING = frame_src.clone();
        if (ok_BOOSTING) {
            rectangle(frameBOOSTING, bboxBOOSTING, Scalar(255, 0, 0), 2, 1);

        }
        else {
            putText(frameBOOSTING, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);

        }
        putText(frameBOOSTING, "BOOSTING Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);
        
        imshow("BOOSTING Tracking", frameBOOSTING);

        Mat frameKCF = frame_src.clone();
        if (ok_KCF) {
            rectangle(frameKCF, bboxKCF, Scalar(255, 0, 0), 2, 1);

        }
        else {
            putText(frameKCF, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);
           // trackerKCF.release();
            //trackerKCF=TrackerKCF::create();
           // trackerKCF->init(frame, newbox);
        }
        putText(frameKCF, "KCF Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);

        imshow("KCF Tracking", frameKCF);


        Mat frameTLD = frame_src.clone();
        if (ok_TLD) {
            rectangle(frameTLD, bboxTLD, Scalar(255, 0, 0), 2, 1);

        }
        else {
            putText(frameTLD, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);

        }
        putText(frameTLD, "TLD Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);

        imshow("TLD Tracking", frameTLD);

        Mat frameMEDIANFLOW = frame_src.clone();
        if (ok_MEDIANFLOW) {
            rectangle(frameMEDIANFLOW, bboxMEDIANFLOW, Scalar(255, 0, 0), 2, 1);

        }
        else {
            putText(frameMEDIANFLOW, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);

        }
        putText(frameMEDIANFLOW, "MEDIANFLOW Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);

        imshow("MEDIANFLOW Tracking", frameMEDIANFLOW);

        Mat frameCSRT = frame_src.clone();
        if (ok_CSRT) {
            rectangle(frameCSRT, bboxCSRT, Scalar(255, 0, 0), 2, 1);

        }
        else {
            putText(frameCSRT, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);

        }
        putText(frameCSRT, "CSRT Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);

        imshow("CSRT Tracking", frameCSRT);


        Mat frameMIL = frame_src.clone();
        if (ok_MIL) {
            rectangle(frameMIL, bboxMIL, Scalar(255, 0, 0), 2, 1);

        }
        else {
            putText(frameMIL, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);

        }
        putText(frameMIL, "MIL Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);

        imshow("MIL Tracking", frameMIL);

        bboxBOOSTING = newbox;
        bboxKCF = newbox;
        bboxTLD = newbox;
        bboxMEDIANFLOW = newbox;
        bboxCSRT = newbox;
        bboxMIL = newbox;

        // Exit if ESC pressed.
        int k = waitKey(1);
        if (k == 27)
        {
            break;
        }
        
        //bool ok = tracker->update(frame, bbox);


    }


}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值