AREngine深度图以一种彩虹视图进行可视化

本文介绍了如何利用华为AREngine获取的深度图,通过OpenGL shader进行彩虹视图的可视化,并采用谷歌的Turbo颜色图进行颜色映射,以提高深度图的显示效果。尽管结果显示的深度图仍存在噪点,作者计划进一步优化深度图的去噪和平滑处理。参考了Google的博客和相关代码示例来实现这一过程。
摘要由CSDN通过智能技术生成

华为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XR风云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值