OpenCV中的立体校正:如果没有目标点,这不应该工作吗?

2024-09-28 21:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个关于用opencv进行立体校准的问题。我有很多像这样的校准图像对:

right

left

在一组定标图像中,棋盘离摄像机的距离不同,在某些镜头中棋盘也会旋转。在

在图像中,从x到y的坐标(在x,I)上。在

为了校准系统,我使用cv2.DetectChessboardCorners()检测了所有棋盘角点的图像坐标对。从阅读哈特利的《计算机视觉中的多视图几何学》,我想我应该能够校准这个系统到一个比例因子,而不需要实际指定棋盘角落的对象点。第一个问题:这个正确吗?在

调查cv2的功能,我发现最接近的是cv2.stereoCalibrate(objectpoints,imagepoints1,imagepoints2)。在

我从cv2.findChessboardCorners获得了imagepoints1和imagepoints2。很显然,从显示的图像中,我可以大致提取(X,Y,Z)相对于校准板上的帧(通过设计),这将允许我应用cv2.stereoCalibrate()。但是,我认为这会带来错误,它阻止我使用所有的旋转照片的校准板,我有。第二个问题:我可以使用opencv在没有对象点的情况下进行校准吗?在

谢谢!在


Tags: 对象图像距离棋盘系统cv2opencv摄像机
1条回答
网友
1楼 · 发布于 2024-09-28 21:28:21
  1. 不。必须指定对象点。请注意,它们不需要在图像序列中发生变化,因为可以将更改解释为相机相对于目标的运动。同样,对于像你这样的平面目标,你可以(应该)假设Z=0。您可以指定X,Y到刻度,从而在校准后获得最大刻度的平移。

澄清:我所说的“无需改变图像序列”,意思是你可以假设目标固定在世界帧中,并将相对运动解释为仅由相机引起。如果没有更好的先验信息,世界帧本身可以由目标在任何一幅图像中的姿态来定义(例如,第一幅图像)。显然,我并不是说目标相对于摄像机的姿态不会改变——事实上,它必须改变才能获得校准。如果你有一个更好的优先级,你应该使用If。例如,如果目标在转台上移动,则应直接求解圆柱运动的参数,因为这些参数较少(一个恒定轴、一个恒定半径、每个图像加一个角度,而不是每个图像6个参数)。在

相关问题 更多 >