0

我对 opencv 完全陌生,最近我被分配了一项任务来查找 kinect 检测到的最近 blob 的中心,这意味着如果你把手伸到 kinect 前面,那么你的手就会变成最近的 blob你的身体。

我得到了一个示例代码,也可以在此处在线找到。到目前为止,我只能想到 2 种方法,一种是使用 cvFindContours() 来获取对象的所有轮廓,然后遍历每个对象并找到最接近的对象。问题是我不知道该怎么做,因为我不知道是否有可以用来获取每个轮廓的深度信息的函数。

我的第二个想法是循环遍历 depthMat 矩阵,找到最低值,它应该是最近的点,然后传播出去找到一个块,然后绘制块。这样做的问题是需要进行大量计算,以至于我的 kinect 视频响应非常缓慢。

有人对这项任务有什么好的建议吗?谢谢。

4

1 回答 1

0

您可以尝试迭代范围选通。Kinect 的最大有效范围约为 6m,因此对于有限的距离,这可能会起作用。

假设深度以厘米为单位(如果以计数为单位,则将计数分成 10、100 或 1000 个计数的箱子,只要看起来合适)。

Mat depthData, objectMask;
Mat closestDepth, closestObjectMask, closestDist;

// getting depth data from kinect out here...

for(int i = 600; i > 0; i -= 20)
{
    threshold(depthData, objectMask, (double)i, 1, THRESH_BINARY_INV);
    // gated out all objects (may need to adjust pixel count for best results)
    Scalar pixelCount = sum(objectMask);
    if(pixelCount.val[0] < 1.0) 
    {
        break;
    }

    closestDepth = depthData; // last good depth data
    closestObjectMask = objectMask; // last good object mask
    closestDist = i; // last closest distance
}

一旦该循环中断,您应该具有以下内容:

  • 最近深度 - 应该是深度图像,用于通过将其与蒙版相乘来获得实际对象距离。
  • 最近的距离 - 应该是“停电”之前的距离门的距离
  • 最近对象掩码 - 应该是最近对象的掩码(用最大轮廓或类似的东西跟踪它)

希望这会有所帮助!

于 2011-10-08T04:35:56.503 回答