我希望你对我遇到的问题有所了解。我有3D点数据以及表示3D场景的强度场(x,y,z,I)
。我希望将这个3D数据转换为图像(强度值为'I'
的2D矩阵)。
我计划使用针孔相机模型(Wikipedia)对3D点进行透视投影。
x'=f*x/z
和y'=f*y/z
我应该为'f'
选择什么值?图像的大小如何依赖于它? (说我需要一张尺寸为500 * 500的图像,适合'f'
的值
由于2D图像中的坐标是整数,我应该如何量化x'
和y'
值并替换相应的强度值?例如。如果我得到两组(使用f=10
)作为
x,y,z,I
(3,1,2,128) -> x',y',I(15,5,128)
(3.1,1.1,2,150) -> (15.5,5.5,150)
在上述两组中,我应该将x'
和y'
值四舍五入并在该坐标处使用其强度,还是应该使用非整数坐标的平均强度?< / p>
生成的图像是否能清晰地描绘2D中的场景(如从相机拍摄的照片)?
要对你的想法表示感谢。感谢
答案 0 :(得分:0)
是否使用平均强度或最近邻居或其他类型的插值取决于您的应用。例如,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
现在,如果我们选择上面最小的f
,那么我们保证点云适合图像(但可能存在间隙)。如果我们选择最大的f
,那么我们保证图像中没有间隙(但可能有部分不适合图像)。