【问题标题】:Boundingbox defintion for opencv object trackingopencv对象跟踪的边界框定义
【发布时间】:2018-08-24 09:04:52
【问题描述】:

采用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)

【问题讨论】:

  • opencv中的Rect对象通常定义为(x,y,w,h),x和y从左上角开始,w是宽h是高
  • 所以基本上:(xmin,ymin,boxwidth,boxheight) ?
  • 一般都是这样,但是我没有测试过那些功能
  • 我测试过了,你是对的

标签: python opencv video-tracking


【解决方案1】:

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

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)

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2018-09-20
      • 2014-06-16
      • 2014-01-09
      • 2012-11-17
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多