用于opencv对象跟踪的Boundingbox定义

时间:2018-03-15 13:56:41

标签: python opencv video-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)

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

另一篇文章将答案说成是事实,所以让我们看看如何自己解决这个问题。

OpenCV的Python版本是主要C ++ API的包装器,所以如果有疑问,咨询main documentation甚至是source code总是有用的。有一个short tutorial提供了有关Python绑定的一些基本信息。

首先,让我们看看cv::TrackerKCFinit成员将边界框作为cv::Rect2d的实例(即cv::Rect_的变体,代表使用double值的参数):

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

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

  

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

不多,所以让我们看看他们指出的the code。行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,宽度和高度的顺序。