我正在尝试将代码从c ++移植到python,在某些时候从.oni记录(OpenNI2)中提取一个帧,缩放为8位并另存为jpg。 我在c ++中使用OpenCV函数convertTo,而python中没有,因此我正在阅读文档以尝试手动执行相同操作,但是出了点问题。
这是c ++
cv::Mat depthImage8;
double maxVal = 650.0;
double minVal = 520.0;
depthImage.convertTo(depthImage8, CV_8UC1, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));
cv::imwrite(dst_folder + "/" + std::to_string(DepthFrameIndex) + "_8bit.jpg", depthImage8);
产生:
这是Python版本:
depth_scale_factor = 255.0 / (650.0-520.0)
depth_scale_beta_factor = -520.0*255.0/(650.0-520.0)
depth_uint8 = (depth_array*depth_scale_factor+depth_scale_beta_factor).astype('uint8')
产生:
此代码似乎有效,但是生成的图像不同,而原始图像(16UC1)是相同的(已检查并逐像素匹配),因此转换函数中应该有问题。
答案 0 :(得分:0)
感谢我提出解决方案的意见。正如用户所说,michelson和Dan Masek Opencv执行saturate_cast操作,而numpy不执行。因此,为了获得相同的结果,Python版本必须为:
depth_uint8 = depth_array*depth_scale_factor+depth_scale_beta_factor
depth_uint8[depth_uint8>255] = 255
depth_uint8[depth_uint8<0] = 0
depth_uint8 = depth_uint8.astype('uint8')