首页 > 解决方案 > 将 float32 转换为 ushort 时丢失图像数据

问题描述

我正在尝试在 OpenCV 中从 UE4 预览 16 位像素阵列。每个像素都是类型FFloat16Color并且有 4 个类型的变量(RGBA)FFloat,FFloat 有两个相关的部分,Encoded(返回一个uint16变量)和GetFloat()函数(返回一个float32

使用这些变量之一,我应该能够在 OpenCV 中创建图像的副本,尽管目前 OpenCV 输出返回一个变暗的图像

使用浮点值我试过乘以 65535、65504 和 32768,如下所示:

PixelVal = (ushort)(floatval*multiplier)

使用encoded我收到“乳白色”图像的版本

encoded变量的计算方式如下(我认为):

FORCEINLINE void FFloat16::Set(float FP32Value)
{
    FFloat32 FP32(FP32Value);

    // Copy sign-bit
    Components.Sign = FP32.Components.Sign;

    // Check for zero, denormal or too small value.
    if (FP32.Components.Exponent <= 112)            // Too small exponent? (0+127-15)
    {
        // Set to 0.
        Components.Exponent = 0;
        Components.Mantissa = 0;

         // Exponent unbias the single, then bias the halfp
         const int32 NewExp = FP32.Components.Exponent - 127 + 15;

         if ( (14 - NewExp) <= 24 ) // Mantissa might be non-zero
         {
             uint32 Mantissa = FP32.Components.Mantissa | 0x800000; // Hidden 1 bit
             Components.Mantissa = Mantissa >> (14 - NewExp);
             // Check for rounding
             if ( (Mantissa >> (13 - NewExp)) & 1 )
             {
                 Encoded++; // Round, might overflow into exp bit, but this is OK
             }
         }
    }
    // Check for INF or NaN, or too high value
    else if (FP32.Components.Exponent >= 143)       // Too large exponent? (31+127-15)
    {
        // Set to 65504.0 (max value)
        Components.Exponent = 30;
        Components.Mantissa = 1023;
    }
    // Handle normal number.
    else
    {
        Components.Exponent = int32(FP32.Components.Exponent) - 127 + 15;
        Components.Mantissa = uint16(FP32.Components.Mantissa >> 13);
    }
}

我在这里想念什么?是什么让直方图表现得这样?

标签: c++opencvunreal-engine4

解决方案


推荐阅读