opencv tracking(3) 多目標(biāo)跟蹤示例

之前講了怎么用opencv3.3.1自帶的API來做單目標(biāo)的跟蹤,多目標(biāo)和這個(gè)差不多,不同的是要用到另一個(gè)類,cv::MultiTracker。
同樣,先附上代碼

#include<tracking.hpp>
#include<highgui.hpp>
#include<video.hpp>
#include<core\utility.hpp>
#include<vector>

using namespace cv;
using namespace std;

int main() {
    Mat frame;
    VideoCapture cap("1.mp4");//輸入待處理的視頻
    cap >> frame;
    vector<Rect> rois;
    selectROIs("rois", frame, rois, false);
    if (rois.size()<1)
        return 0;
    MultiTracker trackers;
    vector<Rect2d> obj;
    vector<Ptr<Tracker>> algorithms;
    for (auto i = 0; i < rois.size(); i++) {
        obj.push_back(rois[i]);
        algorithms.push_back(TrackerKCF::create());
    }
    trackers.add(algorithms, frame, obj);
    while (cap.read(frame)) {
        bool ok = trackers.update(frame);
        if (ok) {
            for (auto j = 0; j < trackers.getObjects().size(); j++) {
                rectangle(frame, trackers.getObjects()[j], Scalar(255, 0, 0), 2, 1);
            }
            imshow("tracker", frame);
        }
        if (waitKey(1) == 27)break;
    }
    return 0;
}

1.創(chuàng)建多目標(biāo)跟蹤對(duì)象

MultiTracker trackers;
你可以創(chuàng)建不同的跟蹤器來組成多目標(biāo)跟蹤對(duì)象,這里,我統(tǒng)一使用的KCF算法。

2.選擇多目標(biāo)

vector<Rect> rois;
selectROIs("rois", frame, rois, false);

注意selectROI與selectROIs函數(shù)的區(qū)別,兩者的原型分別是

CV_EXPORTS_W void selectROIs(const String& windowName, InputArray img, CV_OUT std::vector<Rect>& boundingBoxes, bool showCrosshair = true, bool fromCenter = false);

CV_EXPORTS_W Rect selectROI(const String& windowName, InputArray img, bool showCrosshair = true, bool fromCenter = false);

/** @overload
 */
CV_EXPORTS_W Rect selectROI(InputArray img, bool showCrosshair = true, bool fromCenter = false);

可以看到,單目標(biāo)的選擇函數(shù)返回值是rect型,而多目標(biāo)是void型,于是可以直接調(diào)用selectROIs函數(shù),然后將得到的邊界框存儲(chǔ)在第三個(gè)參數(shù)里。當(dāng)然你也可以調(diào)用selectROI函數(shù),存儲(chǔ)在Rect數(shù)組里。

3.MultiTracker的add方法

    vector<Rect2d> obj;
    vector<Ptr<Tracker>> algorithms;
    for (auto i = 0; i < rois.size(); i++) {
        obj.push_back(rois[i]);
        algorithms.push_back(TrackerKCF::create());
    }
    trackers.add(algorithms, frame, obj);

在多目標(biāo)的API里面,用add方法代替了init方法,給trackers傳入每個(gè)ROI的跟蹤器和邊界框。
注意這里,傳入的邊界框數(shù)據(jù)類型是Rect2d,因?yàn)樯婕暗接?jì)算,所以需要double類型,需要轉(zhuǎn)換一下。

4.保存結(jié)果

for (auto j = 0; j < trackers.getObjects().size(); j++) {
                rectangle(frame, trackers.getObjects()[j], Scalar(255, 0, 0), 2, 1);
            }
image.png

MultiTracker類有g(shù)etObjects方法,可以返回跟蹤對(duì)象的值,依據(jù)此給不同對(duì)象加上矩形框。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,044評(píng)論 0 7
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,618評(píng)論 30 472
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,687評(píng)論 18 399
  • 多目標(biāo)跟蹤的問題是這樣的:有一段視頻,視頻是由 N 個(gè) 連續(xù)幀構(gòu)成的。從第一幀到最后一幀,里面有多個(gè)目標(biāo),不斷地有...
    Fantesla閱讀 6,624評(píng)論 0 9
  • 本來想今天帶你去看張學(xué)友演唱會(huì)的,結(jié)果你不愿意,媽媽就和幾個(gè)朋友去看了。給你預(yù)備了摔跤吧爸爸的電影票,沒有想到你還...
    Cycm閱讀 186評(píng)論 0 0

友情鏈接更多精彩內(nèi)容