另一篇文章将答案陈述为事实,所以让我们看看如何自己弄清楚。
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、宽度和高度的顺序排列。