在华为AREngine根据深度图获取深度信息一文中,我们可以在华为AREngine中获取得到深度信息,获取得到的深度图会有一些噪点需要优化,优化的时候,需要展示出来。在看了ARCORE的深度图之后,感觉ARCORE的深度图展示太漂亮了,他们是怎样展示的呢?本文就尝试利用华为AREngine获取的深度图进行彩虹视图的可视化。
我们先了解一下为啥要用彩色图像进行可视化呢?
假彩色图像出现在计算机视觉和机器学习的许多应用中,从可视化深度图像到更抽象的用途,如图像差分。对图像进行着色有助于人类视觉系统以更直观的方式挑选细节、估计定量值和注意数据中的模式。但是,颜色图的选择可能会对给定任务产生重大影响。例如,对“彩虹地图”的解释与医学成像等关键任务应用的准确性较低有关。不过,在许多应用中,“彩虹地图”是首选的,因为它们显示更多的细节(以牺牲准确性为代价),并允许更快的视觉评估。
计算机视觉应用中最常用的颜色映射算法之一是Jet,它是高对比度的,使它对于强调即使是弱区分的图像特征也很有用。然而,如果您查看颜色贴图渐变,您可以看到不同的颜色“带”,最明显的是在青色和黄色区域。当映射应用于图像时,这将导致尖锐的过渡,当基础数据实际上平滑变化时,这将产生误导。因为颜色“感知”变化的速率不是恒定的,Jet在感知上并不均匀。现在有许多现代的替代方案是统一的和色盲的,如Viridis或Inferno from matplotlib。
今天,我用得是谷歌的Turbo,这是一种新的颜色图,它具有Jet的理想特性,同时也解决了它的一些缺点,如虚假细节、条带和色盲模糊性。Turbo是手工制作和微调的,以有效地执行各种可视化任务。您可以在这里找到Python的颜色映射数据和使用说明,在这里找到C/C++,以及多项式近似。Turbo是Jet的一种替代,适用于感知一致性并不重要的日常任务,但人们仍然希望底层数据的高对比度、平滑可视化。它可以用作顺序地图和发散地图,使它成为工具箱中的一个很好的全能地图。可以使用它来可视化视差图、误差图和各种其他标量量,希望您也会发现它有用。
在OPENGL的shader中实现方式如下:
#define ARCLOUD_DEPTH_SCALE 0.001// mm to m
#define ARCLOUD_MAX_DEPTH_MM 2000.0
#define FAR ARCLOUD_MAX_DEPTH_MM * ARCLOUD_DEPTH_SCALE
#define NEAR 0.1
vec4 showGreyscale(float depth) {
float depth01 = depth / ARCLOUD_MAX_DEPTH_MM;
return vec4(depth01, depth01, depth01, 1.0);
}
// Returns an interpolated color in a 6 degree polynomial interpolation.
vec3 GetPolynomialColor(in float x,
in vec4 kRedVec4, in vec4 kGreenVec4, in vec4 kBlueVec4,
in vec2 kRedVec2, in vec2 kGreenVec2, in vec2 kBlueVec2) {
// Moves the color space a little bit to avoid pure red.
// Removes this line for more contrast.
x = clamp(x * 0.9 + 0.03, 0.0, 1.0);
vec4 v4 = vec4(1.0, x, x * x, x * x * x);
vec2 v2 = v4.zw * v4.z;
return vec3(
dot(v4, kRedVec4) + dot(v2, kRedVec2),
dot(v4, kGreenVec4) + dot(v2, kGreenVec2),
dot(v4, kBlueVec4) + dot(v2, kBlueVec2)
);
}
// Returns a smooth Percept colormap based upon the Turbo colormap:
// https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html
vec3 PerceptColormap(in float x) {
const vec4 kRedVec4 = vec4(0.55305649, 3.00913185, -5.46192616, -11.11819092);
const vec4 kGreenVec4 = vec4(0.16207513, 0.17712472, 15.24091500, -36.50657960);
const vec4 kBlueVec4 = vec4(-0.05195877, 5.18000081, -30.94853351, 81.96403246);
const vec2 kRedVec2 = vec2(27.81927491, -14.87899417);
const vec2 kGreenVec2 = vec2(25.95549545, -5.02738237);
const vec2 kBlueVec2 = vec2(-86.53476570, 30.23299484);
const float kInvalidDepthThreshold = 0.01;
return step(kInvalidDepthThreshold, x) *
GetPolynomialColor(x, kRedVec4, kGreenVec4, kBlueVec4,
kRedVec2, kGreenVec2, kBlueVec2);
}
void main() {
highp float depth_mm = getDepth(colorTexCoord); //深度值,毫米
highp float normalized_depth = depth_mm / ARCLOUD_MAX_DEPTH_MM;
if (isTurbo) {
vec4 depth_color = vec4(PerceptColormap(normalized_depth), 1.0);
fragColor = depth_color;
//fragColor.a = clamp(1.0 - abs((depth_mm - u_DepthRangeToRenderMm) / kDepthWidthToRenderMm), 0.0, 1.0);
} else {
fragColor = vec4(normalized_depth, normalized_depth, normalized_depth, 1.0);
}
}
没有效果图都是耍流氓,请看效果图:
由效果图可以看出,深度图并不理想,比arcore的深度图差远了,华为AREngine又没有进行优化,接下来我继续对深度图去噪点以及平滑,请继续关注。
参考文献:
https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html
https://gist.github.com/mikhailov-work/6a308c20e494d9e0ccc29036b28faa7a