我正在使用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中寻找一个更好的转换功能。
答案 0 :(得分:2)
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颜色空间,您可以在其中操作Hue 0..360度,值1..0并更好地将饱和度设置为最大值。将深度映射到色调和值,转换为RGB并显示。然后回到直方图均衡;)
答案 1 :(得分:1)
试试这个:
const float scaleFactor = 0.05f;
depth.convertTo(depthMat8UC1, CV_8UC1, scaleFactor);
imshow("depth gray",depthMat8UC1);
使用该值来获得您满意的结果