opencv – 项目2d在立体声校准后将相机1图像指向相机2图像

我正在使用opencv对两个摄像头进行立体声校准(让我们将它们命名为L和R).我使用20对棋盘图像并计算R相对于L的变换.我想要做的是使用一对新图像,计算图像L中的2d棋盘角,根据我的校准转换这些点并绘制图像R上的相应变换点,希望它们匹配该图像中棋盘的角.

我尝试了将2d点从[x,y]变换为[x,y,1]的天真方式,乘以3×3旋转矩阵,加上旋转矢量然后除以z,但结果是错误的,所以我猜猜不是那么简单(?)

编辑(澄清一些事情):

我想这样做的原因基本上是因为我想在一对新图像上验证立体声校准.所以,我实际上并不想在两个图像之间进行新的2d转换,我想检查我发现的3d转换是否正确.

这是我的设置:

setup http://i46.tinypic.com/255nb0i.jpg

我有关于两个摄像机(E)的旋转和平移,但是我没有关于每个摄像机(E_R,E_L)的对象的旋转和平移.

理想情况下我想做的事情:

>从相机L中选择图像中的2d角(以像素为单位,例如[100,200]等).
>根据我发现的矩阵E对2d点进行某种变换.
>从相机R获取相应的2d点图像,绘制它们,并希望它们与实际角落匹配!

我想的越多,我就越相信这是错误的/无法完成的.

我现在可能正在尝试的事情:

>使用摄像机的内部参数(比如I_R和I_L),求解2个最小二乘系统,找到E_R和E_L
>从相机L中选择图像中的2d角.
>将这些角投影到相应的3d点(3d_points_L).
> Do:3d_points_R =(E_L).inverse * E * E_R * 3d_points_L
>从3d_points_R获取2d_points_R并绘制它们.

当我有新的东西时,我会更新

最佳答案 这实际上很容易做到,但是你犯了几个错误.请记住,在立体校准后,R和L将第二台摄像机的位置和方向与第一台摄像机的3D坐标系中的第一台摄像机相关联.并且还记得通过一对摄像机找到一个点的3D位置,你需要对位置进行三角测量.通过将z组件设置为1,您将犯两个错误.首先,您很可能使用了常见的OpenCV立体声校准代码,并以棋盘为单位给出了棋盘角的距离(cm).因此,z = 1意味着离相机中心1厘米,这是超级靠近相机.其次,通过为所有点设置相同的z,你说棋盘垂直于主轴(也就是光轴或主光线),而你的图像中很可能并非如此.因此,您首先将一些虚拟3D点转换为第二个相机的坐标系,然后将它们投影到图像平面上.

如果你想只转换平面点,那么你可以找到两个相机之间的单应性(OpenCV有这个功能)并使用它.

点赞