7

采用 opencv 的 tracker.init() 函数的边界框对象是如何定义的?它(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)
4

2 回答 2

12

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

于 2018-03-15T14:23:00.093 回答
5

另一篇文章将答案陈述为事实,所以让我们看看如何自己弄清楚。

OpenCV 的 Python 版本是主要 C++ API 的包装器,因此当有疑问时,查阅主要文档甚至源代码总是很有用的。有一个简短的教程提供了一些关于 Python 绑定的基本信息。

首先,让我们看一下cv::TrackerKCF。该init成员将边界框作为一个实例cv::Rect2d(即,它的一个变体cv::Rect_表示使用double值的参数):

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

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

...
但可能有一些基本的 OpenCV 数据类型,如 Mat、Vec4i、Size。它们需要手动扩展。例如,Mat 类型应该扩展为 Numpy 数组,Size 应该扩展为两个整数的元组等
。...
所有这些手动包装函数都放在modules/python/src2/cv2.cpp.

不多,所以让我们看看他们指向我们的代码。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、宽度和高度的顺序排列。

于 2018-03-15T16:24:22.633 回答