提问人:Robinson 提问时间:9/20/2023 最后编辑:Christoph RackwitzRobinson 更新时间:9/20/2023 访问量:74
short2、10 位整数、5 位分数、1 个符号位
short2, 10 bit integer, 5 bit fraction, one sign bit
问:
NVIDIA 的光流库文档指出,流向量“由 32 位值表示,每个水平和垂直组合都是 16 位值。最低的 5 位保存小数值,然后是 10 位整数值,最高有效位是符号位”。
因此,使用 short2 类型:
struct __device_builtin__ __align__(4) short2
{
short x, y;
};
如何提取两个带有正确符号的浮点数?我在这里的尝试,我觉得并不那么令人信服。至少我的运动矢量看起来不对劲。我不确定的一件事是这是否是两个人的赞美。文件没有说。
struct MotionVector {
float x;
float y;
};
float ExtractSingleMotionValue(short value) {
bool isNegative = (value & 0x8000) != 0; // Check the sign bit
// Clear the sign bit
value = value & 0x7FFF;
// Extract integer part (10 bits)
int intPart = (value >> 5);
// Extract fractional part (5 bits)
float fracPart = value & 0x001F;
fracPart /= 32; // Convert fractional part to actual decimal
float result = intPart + fracPart;
if (isNegative) {
result = -result;
}
return result;
}
MotionVector ExtractMotionVector(short2 value) {
MotionVector mv;
mv.x = ExtractSingleMotionValue(value.x);
mv.y = ExtractSingleMotionValue(value.y);
return mv;
}
谁能提供一些建议?我真的不喜欢我的解决方案。我敢肯定那里有一条线。
答:
2赞
Christoph Rackwitz
9/20/2023
#1
流矢量由一个 32 位值预发,每个水平和垂直组合都是 16 位值。最低的 5 位保存小数值,后跟 10 位整数值,最高有效位是符号位。
这是一种定点格式。所有部分都是尾数*。小数点固定为 5 个小数位。25 = 32。这是必需的“移位”/除数。
这样解释:
short x_raw;
float x_pixels = x_raw * (1.f / 32);
*) 我们不要争论这个标志......好的,让我们
当然,他们没有具体说明负值是如何表示的。根据我的经验,二的补码是显而易见的选择,因此代码简洁,算术中不需要杂技。任何其他形式都是战争罪。
这不是浮点格式。没有提到指数或尾数。
评论
0赞
Robinson
9/20/2023
好的,我已经这样做了,所以我必须在其他地方有一个错误,因为我的向量仍然都是歪斜的。我会继续努力。
2赞
Christoph Rackwitz
9/20/2023
请随时发布这种情况,包括任何原始数据。原始数据与格式无关。每个人都有办法读取原始数据。
0赞
Robinson
9/20/2023
四处挖掘,我在他们的示例中发现了一些代码,这就是他们有效地做的事情,例如: flowData[2 * linearIndex] = (float)(_flowVectors[linearIndex].flowx / float(1 << 5));
评论
x/32.f, y/32.f
-- 让我知道这对你来说是否足够了int
float
-1.0f