是否使用平均强度或最近邻或其他类型的插值取决于您的应用程序。例如,OpenGL 在执行此操作时为您提供选择选项(请参阅 GL_TEXTURE_MIN_FILTER 和 GL_TEXTURE_MAG_FILTER)。
我建议你尝试不同的方法,看看它们是什么样子的;线性和最近邻插值之间的区别是一行代码。有关您的预期应用程序的更多信息可能会有所帮助。
算法上最简单的投影方法不一定是计算效率最高的。如果不是投影点,而是从 2D 像素位置开始,找到相应的附近 3D 点并执行插值(即使只是最近邻插值)以获得强度,则编码要容易得多。这将阻止您在图像中出现例如间隙,并且您不再需要担心由于放大以及像素之间的空间而进行插值。
如何再次投影数据取决于您要实现的目标,因此有关应用程序的更多信息将很有用 - 例如,您是否尝试将所有点都放入图像中?还是您要填充图像?还是云的某些特性使它在投影时很可能被挤压成正方形?如果它是由图像阵列收集的,那么应该可以轻松地对其进行投影(并且上述大部分机制都是不必要的,因为它应该很容易恢复原始坐标)。否则,可能会有图像中没有出现的点或图像中没有对应点的部分。
如果我做出一些假设,那么我可以求解极限的投影方程。如果我们假设一个 640 x 480 的图像并且投影的中心在图像的中心,那么我们有:
x'=f*x/z + 320
(请注意,这是在滥用焦距,因为通常将其映射到像素上,而真实模型将其映射到图像阵列的比例上,然后再映射到像素上)。
设点数组中的最大值和该点greatestx:x
的对应值x
greatestx:z
z
639.5=f*greatestx:x/greatestx:z + 320
所以,
f = 319.5*greatestx:z / greatestx:x
如果对最小的 x 值、最小的 y 值和最大的 y 值执行此操作:
f = -319.5*smallestx:z / smallestx: x
f = 239.5*greatesty:z / greatesty: y
f = -239.5*smallesty:z / smallesty: y
Now if we choose the smallest f
of the above then we guarantee the point cloud to fit into the image (but there might be gaps). If we choose the largest f
then we guarantee there to be no gaps in the image (but there might be parts that don't fit onto the image).