如何定义采用opencv的tracker.init()函数的boundingbox对象?
是(xcenter,ycenter,boxwidht,boxheight)
或(xmin,ymin,xmax,ymax)
或(ymin,xmin,ymax,xmax)
或者完全不同的东西?
我正在使用python和OpenCV 3.3,我基本上对每个想跟踪视频每帧的对象执行以下操作:
tracker = cv2.trackerKCF_create()
ok = tracker.init(previous_frame,bbox)
bbox = tracker.update(current_frame)
答案 0 :(得分:4)
答案是:(xmin,ymin,boxwidth,boxheight)
答案 1 :(得分:2)
另一篇文章将答案说成是事实,所以让我们看看如何自己解决这个问题。
OpenCV的Python版本是主要C ++ API的包装器,所以如果有疑问,咨询main documentation甚至是source code总是有用的。有一个short tutorial提供了有关Python绑定的一些基本信息。
首先,让我们看看cv::TrackerKCF
。 init
成员将边界框作为cv::Rect2d
的实例(即cv::Rect_
的变体,代表使用double
值的参数):
bool cv::Tracker::init(InputArray image, const Rect2d& boundingBox)
现在,问题是,如何在Python中表示cv::Rect2d
(或者一般来说,cv::Rect_
的变体)?我没有发现文档的任何部分清楚地说明这一点(虽然我认为它在教程中暗示过),但是前面提到的绑定教程中有一些有用的信息:
...
但可能有一些基本的OpenCV数据类型,如Mat,Vec4i, 尺寸。它们需要手动扩展。例如,Mat类型 应该扩展到Numpy数组,Size应该扩展为元组 两个整数等。
...所有这些手动包装功能都被放置 在modules/python/src2/cv2.cpp
。
不多,所以让我们看看他们指出的the code。行941 - 954就是我们追求的目标:
template<>
bool pyopencv_to(PyObject* obj, Rect2d& r, const char* name)
{
(void)name;
if(!obj || obj == Py_None)
return true;
return PyArg_ParseTuple(obj, "dddd", &r.x, &r.y, &r.width, &r.height) > 0;
}
template<>
PyObject* pyopencv_from(const Rect2d& r)
{
return Py_BuildValue("(dddd)", r.x, r.y, r.width, r.height);
}
第一个函数中的PyArg_ParseTuple
非常明显。一个4元组的双(浮点)值,按x,y,宽度和高度的顺序。