我有一个函数需要返回一个 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/