c++ - 如何将 16 位无符号整数转换为更大的 8 位无符号整数?

标签 c++

我有一个函数需要返回一个 16 位 unsigned int vector ,但是对于另一个我也调用它的函数,我需要 8 位 unsigned int vector 格式的输出。例如,如果我开始:

std::vector<uint16_t> myVec(640*480);

如何将其转换为以下格式:

std::vector<uint8_t> myVec2(640*480*4);

更新(更多信息): 我正在使用 libfreenect 及其 getDepth() 方法。我修改了它以输出 16 位无符号整数 vector ,以便我可以检索以毫米为单位的深度数据。但是,我还想显示深度数据。我正在使用来自 freenect 安装的一些示例代码 c++,它使用过剩并且需要 8 位无符号整数 vector 来显示深度,但是,我需要 16 位来检索以毫米为单位的深度并将其记录到文本文件中。因此,我希望在 glut 的绘制函数中将数据检索为 16 位无符号整数 vector ,然后转换它,以便我可以使用已经编写的 glut 函数显示它。

最佳答案

根据您的更新,假设 8 位 unsigned int 将显示为灰度图像,您需要的类似于亮度传递函数。基本上,您的输出函数希望将数据映射到 0-255 的值,但您不一定希望这些值直接对应于毫米。如果您的所有数据都来自 0-3 毫米怎么办?那么你的图像看起来几乎是全黑的。如果都是300-400mm呢?然后它将完全变白,因为它被裁剪为 255。

一个基本的方法是找到最小值和最大值,然后这样做:

double scale = 255.0 / (double)(maxVal - minVal);
for( int i = 0; i < std::min(myVec.size(), myVec2.size()); ++i )
{
    myVec2.at(i) = (unsigned int)((double)(myVec.at(i)-minVal) * scale);
}

根据您的数据分布,您可能需要做一些更复杂的事情来充分利用您的动态范围。

编辑:这假定您的过剩函数正在创建图像,如果它使用 8 位值作为图形的输入,那么您可以忽略。

Edit2:您的其他更新之后的更新。如果你想填充一个 640x480x4 的 vector ,你显然是在做一个图像。您需要执行我上面概述的操作,但它正在寻找的 4 个维度是红色、绿色、蓝色和 Alpha。 Alpha channel 需要始终为 255(这控制它的透明度,你不希望它是透明的),至于其他 3 个......你从上面的函数中得到的值(缩放值)如果将所有 3 个 channel ( channel 为红色、绿色和蓝色)设置为相同的值,它将显示为灰度。例如,如果我的数据范围为 0-25mm,对于值为 10mm 的像素,我会将数据设置为 255/(25-0)* 10 = 102,因此像素将为 (102, 102, 102, 255)

编辑 3:添加关于亮度传递函数的维基百科链接 - https://en.wikipedia.org/wiki/Color_mapping

关于c++ - 如何将 16 位无符号整数转换为更大的 8 位无符号整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105194/

相关文章:

c++ - 如何使用 pdb 调试现有的 C++ 可执行文件但没有源代码

c++ - 从另一个进程中查找变量的地址

c++ - 在 std::strcpy 中使用 char*

C++模板参数推导失败

c++ - 这些转换中的哪些应该是不明确的?

c++ - 是否有用于 log4cplus 的标准 Autoconf 宏?

c++ - 为什么 IsValid(Object) 返回 true 后 Object 不能安全使用?

c++ - 为什么构造函数默认不显式?

c++ - Visual Studio C++ 中的静态和动态库链接

c++ - Makefile C++11 错误