简介

。。。

写这篇博客,主要是想嘲笑一下,曾经“鄙视”过别人的自己。

Why?

在我想着去寻找uint8/uint16/float32数据类型的区别前,我已经花了两天的时间在代码调试上。说来也不长,就几百行的代码,我瞅了两天,硬是没看到错在哪里。。。

毕竟,能写下这个题目的时候,我已经是知道了问题出在哪里。

调试最怕的就是,程序也没有报错,但是就是和你认知的数据不对,最怕不知道问题出在哪里。

哎。

不说了,直接上问题吧。

问题及解决办法

稍微有点常识的都知道,OpenCV在显示图像(矩阵)的时候,要求矩阵必须为整形int,因此通常的思路肯定是,在显示深度图像的时候,由于不知道读取的深度图像是什么数据类型,我们通过数据类型转换,将其转换为整型。

到这个时候,思路还是没有错的。但是我忽略了一点,整型毕竟还有8位、16位的。而并没有深入关注他们区别(或者说真的是忘记这个事情了),我在转换数据的时候,倒霉催的用了uint8。语句如下:

   depth_data = np.asanyarray(aligned_depth_frame.get_data(), dtype="uint8")

然后问题来了。

uint8保存的数据,是0-255.(稍微有点常识都知道对吧。。是的,我忘记了)
uint16 保存的数据,是0-65535.

当我用上述语句转换矩阵时,矩阵中大于255的数据,都被转换到0-255内。

整个矩阵都发生了变化!

问题找到了,程序也就能正常通过了。

但是最令我愧疚的一个事情是,就在上周,我刚把深度数据代码跑通的时候,我看到原作者的程序里里有这么两句话。


 # 把图像像素转化为数组
   depth_data = np.asanyarray(aligned_depth_frame.get_data(), dtype="float16")
   depth_image = np.asanyarray(aligned_depth_frame.get_data())
  

我当时一看,哎呦,这作者是有病吗,同样的一个数据,命名两次?不嫌占内存吗?

于是我自作聪明的,昨天在整合程序的时候,删掉了第一个读取。

于是,有了这两天的焦头烂额。。。

。。。

突然想到一句话,不怕人傻,就怕人傻而不自知。

我错了,我为我的愚蠢给原作者道歉。

只能说,我很庆幸,在数据采集的时候,我没有删掉那句话,起码我现在保存的实验数据是对的。

引以为戒。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐