如何使 OpenCV 跟踪类从基类派生?

问题描述

OpenCV 跟踪 API 在 3 个不同的地方有实现。

  • video/tracking.hpp
  • tracking.hpp
  • tracking/tracking_legacy.hpp

我希望能够通过提供算法名称作为输入来使用任何实现。

cv::Ptr<cv::Tracker> get_tracker(std::string trackerType);

A similar approach with Python 似乎有效。

if tracker_type == 'CSRT':
    tracker = cv2.TrackerCSRT_create()
elif tracker_type == 'MOSSE':
    tracker = cv.legacy.TrackerMOSSE_create()
...
ok = tracker.init(frame,bbox)
ok,bbox = tracker.update(frame)

C++ 的问题是 tracker 的类型应该在编译时知道。

different implementations using templates 是函数的解决方案,但我们返回的是一个对象,所以这不适用。

正确的解决方案是使用继承从具有纯虚函数 initupdate 的基类派生 cv::Trackercv::legacy::Tracker。这两个类都有这些方法,但它们分别派生自 cv::Algorithm,而 #include <opencv2/tracking.hpp> #include <opencv2/tracking/tracking_legacy.hpp> #include <string> #include <stdexcept> // https://docs.opencv.org/4.5.2/d0/d0a/classcv_1_1Tracker.html cv::Ptr<cv::Tracker> get_tracker(std::string trackerType) { if (trackerType == "MIL") return cv::TrackerMIL::create(); if (trackerType == "GOTURN") return cv::TrackerGOTURN::create(); if (trackerType == "CSRT") return cv::TrackerCSRT::create(); if (trackerType == "KCF") return cv::TrackerKCF::create(); throw std::runtime_error("Unknown tracker type."); } // https://docs.opencv.org/4.5.2/db/dfe/classcv_1_1legacy_1_1Tracker.html cv::Ptr<cv::legacy::Tracker> get_legacy_tracker(std::string legacyTrackerType) { if (legacyTrackerType == "MIL") return cv::legacy::TrackerMIL::create(); if (legacyTrackerType == "BOOSTING") return cv::legacy::TrackerBoosting::create(); if (legacyTrackerType == "MEDIANFLOW") return cv::legacy::TrackerMedianFlow::create(); if (legacyTrackerType == "TLD") return cv::legacy::TrackerTLD::create(); if (legacyTrackerType == "KCF") return cv::legacy::TrackerKCF::create(); if (legacyTrackerType == "MOSSE") return cv::legacy::TrackerMOSSE::create(); if (legacyTrackerType == "CSRT") return cv::legacy::TrackerCSRT::create(); throw std::runtime_error("Unknown legacy tracker type."); } 没有任何这些函数。

到目前为止,我创建了单独的函数来获取跟踪器对象。

Tracker

我将跟踪器类型作为命令行输入。任何使以下代码适用于所有跟踪器类型的解决方案都值得赞赏。 legacy 可用时优先于 tracker->init(frame,bbox); bool ok = tracker->update(frame,bbox);

legacy

注意:我使用的是 OpenCV 4.5.2。 opencv-python==4.5.2 模块在 this commit 中创建。

另一个注意事项:目前,{{1}} 的 pip 包不可用。提供的 Python 代码未经测试,而是根据文档编写的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)