opencv 对象跟踪的边界框定义

Boundingbox defintion for opencv object tracking

采用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)

答案是:(xmin,ymin,boxwidth,boxheight)

另一个post将答案陈述为事实,所以让我们看看如何自己找出答案。

OpenCV 的 Python 版本是主要 C++ API 的包装器,所以当有疑问时,咨询 main documentation, or even the source code. There is a short tutorial 提供一些关于Python 绑定。

首先,让我们看一下cv::TrackerKCF. The init member takes the bounding box as an instance of cv::Rect2d (i.e. a variant of cv::Rect_,它代表使用double个值的参数:

bool cv::Tracker::init(InputArray image, const Rect2d& boundingBox)

现在的问题是,cv::Rect2d(或者一般来说,cv::Rect_ 的变体)如何在 Python 中表示?我还没有找到明确说明这一点的文档的任何部分(尽管我认为它在教程中有所暗示),但是前面提到的绑定教程中有一些有用的信息:

...
But there may be some basic OpenCV datatypes like Mat, Vec4i, Size. They need to be extended manually. For example, a Mat type should be extended to Numpy array, Size should be extended to a tuple of two integers etc.
...
All such manual wrapper functions are placed in modules/python/src2/cv2.cpp.

不多,让我们看看the code they point us at. Lines 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相当self-explanatory。双精度(浮点)值的 4 元组,顺序为 x、y、宽度和高度。