簡體   English   中英

在c ++中的opencv convertTo和Python中的手動轉換之間有不同的結果

[英]different result between opencv convertTo in c++ and manual conversion in Python

我正在嘗試將代碼從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)是相同的(已檢查並且它們逐像素匹配),因此轉換函數中應該有問題。

多虧了這些評論,我才提出了解決方案。 正如用戶所說,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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM