python | uint8 & uint16 数据类型转换导致的数据变化

简介

。。。

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

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())
  

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

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

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

。。。

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

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

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

引以为戒。

  • 34
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值