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、宽度和高度。
采用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 inmodules/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、宽度和高度。