如何填充kinect v1深度图像中的黑色斑块

时间:2017-07-27 13:40:27

标签: python opencv image-processing kinect depth

我正在使用具有以下信息的对象分割数据集:

Introduced: IROS 2012

Device: Kinect v1

Description: 111 RGBD images of stacked and occluding objects on table.

Labelling: Per-pixel segmentation into objects.

页面链接:http://www.acin.tuwien.ac.at/?id=289

我正在尝试使用数据集提供的深度图。但是,深度图似乎完全是黑色的。enter image description here

以上深度图的原始图像 enter image description here

我尝试进行一些预处理并对图像进行标准化处理,以便可以以灰色图像的形式显示深度图。

img_depth = cv2.imread("depth_map.png",-1) #depth_map.png has uint16 data type
depth_array = np.array(img_depth, dtype=np.float32)
frame = cv2.normalize(depth_array, depth_array, 0, 1, cv2.NORM_MINMAX)
cv2.imwrite('capture_depth.png',frame*255)

执行此预处理的结果是: enter image description here

在stackoverflow中的一篇帖子中,我读到这些黑色补丁是未定义深度图的区域。

如果我必须使用此深度图,那么填充这些未定义区域的最佳方法是什么?(我正在考虑用K-最近邻居填充这些区域但感觉可能会更好方式)。

是否存在没有此类问题的RGB-D数据集或这些问题始终存在?解决此类问题的最佳方法是什么?

提前致谢!

2 个答案:

答案 0 :(得分:2)

几乎每种3D成像技术都会产生无效或缺失点的数据。缺乏纹理,太陡峭的斜坡,遮蔽,透明度,反射,......你的名字。

填充这些洞没有神奇的解决方案。您需要某种插值,或者您可能会根据某些模型替换缺失点。

互联网上到处都是填充洞的方法。大多数强度图像技术都可以成功应用于深度图像。

这取决于您的应用程序,您的要求以及您对对象的了解。

3d中的数据质量是时间,金钱以及对象和技术的正确组合的问题。

答案 1 :(得分:1)

吸收或散射Kinect IR的区域(如光泽表面或锐边)填充零像素值(表示未计算的深度)。近似填充这些区域周围的非捕获数据的方法是使用5×5窗口的统计中值。这种方法适用于Kinect深度图像。可以在链接中看到MatlabC#的示例实现。