OpenCV物体跟踪的边界框定义

7
opencv的tracker.init()函数中的boundingbox对象是如何定义的? 是 (xmin,ymin,xmax,ymax) 还是 (xcenter,ycenter,boxwidht,boxheight) 或者是 (ymin,xmin,ymax,xmax) 还是其他完全不同的东西?
我正在使用Python和OpenCV 3.3,在视频的每个帧上对要跟踪的每个物体执行以下操作:
tracker = cv2.trackerKCF_create()
ok = tracker.init(previous_frame,bbox)
bbox = tracker.update(current_frame)

3
在OpenCV中,矩形对象通常定义为(x,y,w,h),其中x和y来自左上角点,w表示宽度,h表示高度。 - api55
所以基本上是:(xmin,ymin,boxwidth,boxheight)? - gustavz
通常是这样的,但我还没有测试过那些函数。 - api55
我测试过了,你是正确的。 - gustavz
2个回答

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

6
另一篇文章将答案陈述为事实,因此让我们看看如何自己解决问题。Python版本的OpenCV是主要C++ API的包装器,所以有疑问时,查阅主要文档或甚至源代码总是很有用的。有一个简短的教程提供了有关Python绑定的一些基本信息。首先,让我们看看cv::TrackerKCFinit成员将边界框作为cv::Rect2d实例(即使用double值表示参数的cv::Rect_变体):
bool cv::Tracker::init(InputArray image, const Rect2d& boundingBox)

现在的问题是,cv::Rect2d(或一般情况下的cv::Rect_变量)在Python中如何表示?我没有找到任何明确说明这一点的文档部分(虽然我认为这在教程中有所暗示),但先前提到的绑定教程中有一些有用的信息:

...但可能会存在一些基本的OpenCV数据类型,如Mat、Vec4i、Size等。它们需要手动扩展。例如,Mat类型应扩展为NumPy数组,Size应扩展为两个整数的元组等。

所有这些手动包装函数都放置在modules/python/src2/cv2.cpp中。

没有太多信息,让我们看看它们指向的代码。我们要看的是第941954行:
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、宽度和高度的顺序排列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接