【问题标题】:Convert kinects depth to RGB将 kinect 深度转换为 RGB
【发布时间】:2013-07-30 10:56:57
【问题描述】:

我正在使用 OpenNI 和 OpenCV(但没有支持 openni 的最新代码)。如果我只是将深度通道发送到屏幕 - 它会看起来很暗并且难以理解。所以我想为用户显示一个颜色的深度通道,但找不到如何在不损失准确性的情况下做到这一点。现在我这样做了:

xn::DepthMetaData xDepthMap;
depthGen.GetMetaData(xDepthMap);
XnDepthPixel* depthData = const_cast<XnDepthPixel*>(xDepthMap.Data());
cv::Mat depth(frame_height, frame_width, CV_16U, reinterpret_cast<void*>(depthData));

cv::Mat depthMat8UC1;
depth.convertTo(depthMat8UC1, CV_8UC1);

cv::Mat falseColorsMap;
cv::applyColorMap(depthMat8UC1, falseColorsMap, cv::COLORMAP_AUTUMN);
depthWriter << falseColorsMap;

但在这种情况下,我得到的输出比 Windows 的 kinects 软件显示的更糟糕(丢失细节)。所以我正在寻找一个在 OpenNI 或 OpenCV 中具有更好转换的函数。

【问题讨论】:

    标签: opencv kinect openni


    【解决方案1】:

    ghttps://github.com/OpenNI/OpenNI2/blob/master/Samples/Common/OniSampleUtilities.h 该链接是直方图均衡的代码。简而言之,它使每个级别的概率相等,并优化了 10,000 个级别和 255 个级别之间的映射。这就是为什么 Kinect 淡黄色地图看起来比天真的 I=255*z/z_range 更好。

    注意:请勿使用颜色进行可视化,因为人眼对亮度变化比对颜色变化更敏感。因此,使用 255 级亮度时,您将获得比使用 255*255*255 级颜色时更好的对比度。如果您仍然决定沿颜色映射途径使用 HSV 颜色空间,您可以在其中操纵色调 0..360 度、值 1..0 并更好地将饱和度设置为最大值。将深度映射到色调和值,转换为 RGB 并显示。比回到直方图均衡;)

    【讨论】:

    【解决方案2】:

    试试这个:

    const float scaleFactor = 0.05f;
    depth.convertTo(depthMat8UC1, CV_8UC1, scaleFactor);
    imshow("depth gray",depthMat8UC1);
    

    发挥价值以获得您满意的结果

    【讨论】:

    • scaleFactor 不应该是 255/max(depth) 吗?
    • 255.0/4096.0 = 0.062255859375 所以你可以试试。在实践中,我认为并非所有 4096 值都可用(因为准确度呈指数下降)。如果您只想应用不同的映射进行可视化,您只需为比例因子添加一个滑块并稍微修改一下以获得您想要的缩放/范围
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多