在c ++中的opencv convertTo和Python中的手动转换之间有不同的结果

时间:2018-12-07 17:16:55

标签: python c++ opencv

我正在尝试将代码从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);

产生:

enter image description here

这是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')

产生:

enter image description here

此代码似乎有效,但是生成的图像不同,而原始图像(16UC1)是相同的(已检查并逐像素匹配),因此转换函数中应该有问题。

1 个答案:

答案 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')