c++ - 将 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);
}
}
我在这里想念什么?是什么让直方图表现得这样?
解决方案
推荐阅读
- python - Python AttributeError:“str”对象没有属性“decode”
- c++ - C++ dll定义静态成员
- java - 在tomcat中,如何在其他项目中获取类的注释
- ruby-on-rails - 使用 remotipart gem 和 Paperclip 在 Ruby on Rails 中上传图像
- mysql - SQL选择两列组合的最高行
- c - 试图打印出用户空间内存的内容
- c++ - 从 C++ 服务器获取
- awk - 如何使用 AWK 用空格右填充字段
- python - 使用 sklearn 进行预测建模管道
- angular - Angular 5 ngFor 在表单标签中选择选项 ngModel