stixel-world和psmnet结合出现的问题

float32位,4字节

原本的stixel-world是用sgbm生成深度图,并且转成了float型

psmnet保存最终的disparity图是保存成uint16的,skimage.io.imsave(test_left_img[inx].split('/')[-1],(img*256).astype('uint16'))

最开始我采用的是直接保存成图片,cv2.save(save_dir,img),img本身是个一通道的,保存之后是个三通道的,然后在stixel-world读取图片的时候只读一个通道cv::imread(img,-1)就可以读出disparity

直接操作不能得出正确的值,因为图片本身是uchar型,也就是0到255,不能是其他的.这样精确度就只能到整数,原本的float被强制变成了int型

我想要保存原本的float型,opencv可以使用xml保存这些值,imwrite无法实现

因为PSMnet的代码是python的,也可以将这些值保存为.npy格式的文件,但stixel-world是c++的,读取是mat,这样就不好操作,有一些开源项目能进行这种转换,但太麻烦

最终我选择了将img直接保存成txt格式,stixel-world把这些txt读取到mat中

numpy保存成txt有个专门的函数是savetxt,我这样使用:np.savetxt(save_dir,img,fmt="%f",delimiter=",")

 

从txt可以看出值的差别不是特别大,所以保存成int就没区别了

之前跑代码会出现有时候没办法跑,有时候能跑,加了cout之后反而能跑

cout能够清理缓存,猜测可能是这个原因

在这段代码之前还用了infile1 open了一个文件,如果使用infile.close就能清理缓存

其实这个跟python的一样,只是with open自己使用了close.以后在使用infile读取的时候,使用完了之后还是要close清理一下,这样能避免很多错误

原文地址:https://www.cnblogs.com/ymjyqsx/p/9042132.html