【问题标题】:Simulate camera with distortion in pyBullet在 pyBullet 中模拟失真的相机
【发布时间】:2021-06-03 07:26:01
【问题描述】:

我正在尝试根据从校准真实相机获得的内在和外在参数在 pyBullet 中配置相机。

我有什么

相机用OpenCV校准,给我一个相机矩阵

|f_x  0  c_x|
| 0  f_y c_y|
| 0   0   1 |

和一个失真系数向量

(k_1, k_2, p_1, p_2, k_3)

(我还有相机的姿势,但这与实际问题无关,所以我把它放在这里。)

我已经做过的事情

不幸的是,pyBullet 的computeProjectionMatrix 功能有点受限。它假设f_x = f_yc_x, c_y 正好位于图像的中心,这对我的相机来说都不是真的。因此我自己计算投影矩阵如下(基于this):

projection_matrix = [
    [2/w * f_x,  0,  (w - 2c_x)/w,  0],
    [0,  2/h * f_y,  (2c_y - h)/h,  0],
    [0, 0, A, B],
    [0, 0, -1, 0],
]

其中w,h 是图像的宽度和高度,A = (near + far)/(near - far)B = 2 * near * far / (near - far)nearfar 定义了图像中包含的 z 轴范围(请参阅pybullet.computeProjectionMatrix) .

还缺少什么(我的实际问题)

上面已经给了我更好的结果,但是渲染的图像仍然与真实图像不完全匹配。我怀疑其中一个原因可能是没有考虑失真。

所以终于来回答我的问题了:

如何使用我从校准真实相机中获得的参数来实现模拟相机的失真?

有没有办法可以将它整合到投影矩阵中?如果没有,还有其他方法吗?

【问题讨论】:

  • 物理系统(Bullet)与渲染属性(相机失真)有什么关系?物理系统只是确定对象在虚拟空间中的位置。
  • “除了物理模拟之外,pybullet 还支持渲染,带有 CPU 渲染器和 OpenGL 可视化并支持虚拟现实耳机。”
  • @NicolBolas pyBullet 还提供渲染功能。我正在使用 pyBullet 的 getCameraImage 函数,它将此处提到的投影矩阵作为输入。
  • 一般非线性失真不能用矩阵来完成。
  • 啊,对,我没有考虑非线性。我现在通过首先渲染图像而不失真然后扭曲结果来解决它。我稍后会在答案中写出来。

标签: opengl camera camera-calibration pybullet


【解决方案1】:

正如 cmets 中所指出的,非线性失真不能集成到矩阵中。我现在正在做的是首先渲染图像而不失真,然后在第二步中使用来自this answer的代码来扭曲生成的图像。

图像由于失真而缩小了一点,因此在保持图像尺寸固定时,图像边缘会出现一些空白区域。为了弥补这一点,我将图像渲染为比所需尺寸稍大的尺寸,然后在扭曲后进行裁剪。注意中心点(c_x, c_y)在增大尺寸时需要相应调整。

用一些伪代码来说明:

desired_image_size = (width, height)

# add 10% padding on each size
padding = desired_image_size * 0.1
render_image_size = desired_image_size + 2 * padding

# shift the centre point accordingly (other camera parameters are not changed)
c_x += padding[0]
c_y += padding[1]

# render image using the projection_matrix as described in the question
image = render_without_distortion(projection_matrix, camera_pose)

image = distort_image(image)

# remove the padding
image = image[padding[0]:-padding[0], padding[1]:-padding[1]]

这会导致图像与真实相机中的图像非常匹配。

完整的实现可以在here找到。

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 2023-04-03
    • 2013-05-23
    • 2017-11-13
    • 2020-12-06
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多