python | uint8 & uint16 数据类型转换导致的数据变化
简介。。。写这篇博客,主要是想嘲笑一下,曾经“鄙视”过别人的自己。Why?在我想着去寻找uint8/uint16/float32数据类型的区别前,我已经花了两天的时间在代码调试上。说来也不长,就几百行的代码,我瞅了两天,硬是没看到错在哪里。。。毕竟,能写下这个题目的时候,我已经是知道了问题出在哪里。调试最怕的就是,程序也没有报错,但是就是和你认知的数据不对,最怕不知道问题出在哪里。哎。不说了,直接
简介
。。。
写这篇博客,主要是想嘲笑一下,曾经“鄙视”过别人的自己。
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())
我当时一看,哎呦,这作者是有病吗,同样的一个数据,命名两次?不嫌占内存吗?
于是我自作聪明的,昨天在整合程序的时候,删掉了第一个读取。
于是,有了这两天的焦头烂额。。。
。。。
突然想到一句话,不怕人傻,就怕人傻而不自知。
我错了,我为我的愚蠢给原作者道歉。
只能说,我很庆幸,在数据采集的时候,我没有删掉那句话,起码我现在保存的实验数据是对的。
引以为戒。
更多推荐
所有评论(0)