【发布时间】: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_y 和c_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)、near 和 far 定义了图像中包含的 z 轴范围(请参阅pybullet.computeProjectionMatrix) .
还缺少什么(我的实际问题)
上面已经给了我更好的结果,但是渲染的图像仍然与真实图像不完全匹配。我怀疑其中一个原因可能是没有考虑失真。
所以终于来回答我的问题了:
如何使用我从校准真实相机中获得的参数来实现模拟相机的失真?
有没有办法可以将它整合到投影矩阵中?如果没有,还有其他方法吗?
【问题讨论】:
-
物理系统(Bullet)与渲染属性(相机失真)有什么关系?物理系统只是确定对象在虚拟空间中的位置。
-
“除了物理模拟之外,pybullet 还支持渲染,带有 CPU 渲染器和 OpenGL 可视化并支持虚拟现实耳机。”
-
@NicolBolas pyBullet 还提供渲染功能。我正在使用 pyBullet 的
getCameraImage函数,它将此处提到的投影矩阵作为输入。 -
一般非线性失真不能用矩阵来完成。
-
啊,对,我没有考虑非线性。我现在通过首先渲染图像而不失真然后扭曲结果来解决它。我稍后会在答案中写出来。
标签: opengl camera camera-calibration pybullet