MultiTracker getobjects为每个对象返回相同的点

问题描述 投票:0回答:1

我正在尝试使用opencv中的multritracker算法,但是正如我提到的,我无法添加多个跟踪器。我仅在杂色为空(第一次调用)时才碰到这部分代码,并在最后将其删除(选中)。

if (bboxes.empty()) {
            bboxes.resize(number_of_rois);
            for (int i = 0; i < number_of_rois; i++) {
                // Bounding Boxes
                bboxes[i].x = int(res[i].xLeft);
                bboxes[i].y = int(res[i].yTop);
                bboxes[i].width = int(res[i].xRight - res[i].xLeft);
                bboxes[i].height = int(res[i].yBottom - res[i].yTop);

                // Create multitracker
                if (multiTracker.empty()) {
                    multiTracker = cv::MultiTracker::create();
                }
                error = multiTracker->add(tracker, frame, Rect2d(bboxes[i]));
            }
        }

也尝试了第二种可能的功能,但结果相同:

bool    add (std::vector< Ptr< Tracker > > newTrackers, InputArray image, std::vector< Rect2d > boundingBox)

之后,我尝试将边界框从dll返回到我的程序那时的调试为我显示了每个对象相同的结果,尽管我的投资回报率不同。

// Bounding Rects
            res[i].xLeft = float(multiTracker->getObjects()[i].x);
            res[i].xRight = float(multiTracker->getObjects()[i].x + multiTracker->getObjects()[i].width);
            res[i].yTop = float(multiTracker->getObjects()[i].y);
            res[i].yBottom = float(multiTracker->getObjects()[i].y + multiTracker->getObjects()[i].height);

我很高兴在这里提出您的一些想法。

OpenCV:4.0.1

opencv object object-detection tracking
1个回答
0
投票

我很抱歉,我使用相同的“ tracker”指针添加了第二个跟踪器。

解决方案:

总是创建一个新的跟踪器,如下所示:

Ptr<Tracker> createTrackerByName(int method) {
    Ptr<Tracker> tracker;
    switch (method) {
    case 0: tracker = TrackerBoosting::create();            break;
    case 1: tracker = TrackerMIL::create();                 break;
    case 2: tracker = TrackerKCF::create();                 break;
    case 3: tracker = TrackerTLD::create();                 break;
    case 4: tracker = TrackerMedianFlow::create();          break;
    case 5: tracker = TrackerGOTURN::create();              break; 
    case 6: tracker = TrackerMOSSE::create();               break;
    case 7: tracker = TrackerCSRT::create();                break;
    default:
//errors here
        break;
    }
    return tracker;
}
© www.soinside.com 2019 - 2024. All rights reserved.