重新初始化后 OpenCV 3 Tracker 将无法工作
Posted
技术标签:
【中文标题】重新初始化后 OpenCV 3 Tracker 将无法工作【英文标题】:OpenCV 3 Tracker won't work after reinitialization 【发布时间】:2015-07-15 14:10:04 【问题描述】:我在使用 OpenCV 3 跟踪模块进行跟踪时遇到问题。它的行为相同,我使用接口类(cv::Tracker)或具有实现的类(如 cv::TrackerMedianFlow 或 cv::TrackerMIL 等)。示例是来自 OpenCV 示例文件夹的一些修改示例 正确创建后
Ptr<Tracker> tracker = Tracker::create( tracker_algorithm );
if ( tracker == NULL )
std::cout << "***Error in the instantiation of the tracker...***\n";
return -1;
初始化工作正常
if ( !tracker->init( frame, boundingBox ) )
std::cout << "***Could not initialize tracker...***\n";
return -1;
当跟踪丢失时,问题出现在主循环的后期。我使用单独的检测器来定义新目标。当我找到新目标时,我清除跟踪器并用新值初始化它
tracker->clear( );
if ( !tracker->init( frame, detectedNewBBox) )
std::cout << "***Could not initialize tracker without history...***\n";
return -1;
但是,初始化总是返回 false。我试图找出为什么无法初始化跟踪器? 数据检查了几次,看起来很正确。我什至进行了小型实验,尝试在创建后立即使用相同的数据初始化跟踪器,它不会初始化循环并且它工作得很好。 难道我做错了什么?我无法找到有关此的任何文档... 以下是可用文档的链接: OpenCV 3 Tracker documentation
感谢您的努力!
【问题讨论】:
【参考方案1】:我刚刚遇到了同样的问题,这是我如何让它工作的:
tracker->clear();
Ptr<Tracker> trackerNew = Tracker::create( tracker_algorithm );
tracker = trackerNew;
tracker->init( image, boundingBox );
可能不是正确的方式或最漂亮的方式,但它可以完成工作:)
【讨论】:
tracker->clear();
删除所有Rect
(矩形向量),有没有办法删除任何特定的矩形?谢谢【参考方案2】:
如果您想跟踪新的 ROI(感兴趣区域),那么我建议您应该创建一个新的跟踪器,而不是清除并尝试重用以前的跟踪器。当您需要调用 init 时重复使用不会提供额外的好处。如您所见,默认情况下不允许重新初始化跟踪器。
但是,如果您想通过更正来恢复对同一对象的跟踪,则可以通过执行以下步骤来实现(我自己还没有尝试过。以下代码只是伪代码)
Ptr<TrackerModel> model = tracker->getModel();
Ptr<TrackerTargetState> lastTargetstate = getLastTargetState();
// Make changes to lastTargetState (update position etc)
// Set lastTargetState, I am not sure if you need to actually set it
// or just editing the object through pointer should work.
model->setLastTargetState(lastTargetstate);
【讨论】:
getLastTargetState() 在我的情况下给出了一个错误,说“尝试读取或写入受保护的内存”!【参考方案3】:我遇到了同样的问题,这是我的解决方案: 打开 opencv_contrib/modules/tracking/src/tracker.cpp 中的文件并应用以下更改:
- if( isInit )
+ /*if( isInit )
return false;
+ */
我重新编译了opencv3并重新安装了它。那为我修好了。我认为他们不希望人们出于某种原因重新初始化跟踪器。不知道为什么?
【讨论】:
以上是关于重新初始化后 OpenCV 3 Tracker 将无法工作的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV的,如何将参数传递到cv2.TrackerMedianFlow_create功能?
OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 失败,但在 X86_64 中有效
Rosmin--OpenCV Color Blob Tracker on Android
Rosmin--OpenCV Color Blob Tracker on Android