首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pyBullet中模拟带有畸变的摄像机

在pyBullet中模拟带有畸变的摄像机
EN

Stack Overflow用户
提问于 2021-03-04 15:56:18
回答 1查看 605关注 0票数 0

我试图配置一个相机在pyBullet基于内部和外部参数获得的校准一个真正的相机。

我所拥有的

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

代码语言:javascript
复制
|f_x  0  c_x|
| 0  f_y c_y|
| 0   0   1 |

和失真系数的向量

代码语言:javascript
复制
(k_1, k_2, p_1, p_2, k_3)

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

我已经做了什么

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

代码语言:javascript
复制
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)。

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

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

最后来问我的问题:

如何利用校准真实相机所获得的参数来实现模拟相机的失真?

有什么方法可以把它集成到投影矩阵中吗?如果没有,还有别的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-05 15:31:23

正如评论中所指出的,非线性失真不能集成到矩阵中.我现在要做的是首先在不失真的情况下渲染图像,然后使用来自这个答案的代码在第二步中对结果图像进行扭曲。

由于图像的失真,图像会缩小一些,所以当图像大小保持不变时,图像的边缘会出现一些空白区域。为了弥补这一点,我呈现的图像比需要的稍大一些,然后在扭曲后裁剪。请注意,当增大大小时,需要相应地调整中心点(c_x, c_y)

为了用一些伪代码来说明:

代码语言:javascript
复制
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]]

这使得图像与真实相机的图像很好地匹配。

完整的实现可以找到这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66478579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档