首页 文章

将像素从一个图像重新投影到另一个图像

提问于
浏览
9

我有许多校准过的相机拍摄平面场景的照片 . 为简单起见,我们假设有3个摄像头 . 那些相机正在进行一般运动,但主要是翻译加上一些温和的旋转 . Example positions of cameras

任务是完全缝合它们 . 我不了解3D坐标,只是用校准相机拍摄的一组图像 .

我所做的:

我在OpenCV中使用SURF / SIFT实现检测特征,通过在每对图像之间使用 findHomography 来获得初始单应性(1-> 2,2-> 3,1-> 3) . 从那些单应性我得到每个相机的姿势的初始esitimation (similiar procedure to this)

然后我尝试使用束调整技术来最小化每个匹配对的重投影错误 . 优化参数是三个平移值和三个旋转值(从Rodrigues的旋转公式获得),尽管我可以稍后添加内部参数(焦点,主要点等) .

假设图像#2将是参考帧(通过与其他两个图像具有最大量的匹配),其旋转和平移矩阵分别是同一性和零矩阵 .

我计算从图像#2到图像#1的关键点(在图像#2和图像#1中均可见)的重投影为(伪代码)

[x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2;
x1 = x1_/z1_;
y1 = y1_/z1_;

要么

x1 = ((f1/f2)*r11*x2 + (f1/f2)*r12*y2 + f1*r13 + f1*tx/Z2) / ((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + tx/Z2)
y1 = ((f1/f2)*r21*x2 + (f1/f2)*r22*y2 + f1*r23 + f1*ty/Z2) / ((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + ty/Z2)

其中r__是R1矩阵的元素,两个内在矩阵都是

[f 0 0]
[0 f 0]
[0 0 1]

我假设参考帧的Z2坐标为1 .

下一阶段是使用所获得的相机矩阵(K1,R1,T1,K3,R3,T3)将图像#1和#3变形为图像#2的公共坐标系 .

问题是我不知道正确重投影到图像#2的参考帧所需的Z1和Z3,因为来自图像#1 - >#2的反转重投影看起来像这样:

x2 = ((f2/f1)*R11*x1 + (f2/f1)*R12*y1 + f2*R13 - f0/Z1*(R11*tx + R12*ty + R13*tz)) / ((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz))
y2 = ((f2/f1)*R21*x1 + (f2/f1)*R22*y1 + f2*R23 - f0/Z1*(R21*tx + R22*ty + R23*tz)) / ((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz))

其中R__是inv(R1)矩阵的元素 .

是否有更好的方法来计算束调整(2d-> 2d)的重投影误差,然后将图像变形为公共坐标系?我注意到OpenCV在其拼接模块中具有非常类似的框架,但它在纯旋转运动的假设下运行,这不是这里的情况 .

2 回答

  • 1

    我在帖子中自动回答了这个问题How to get points in stereo image from extrinsic parameters

    请注意我使用的方法(经过测试和工作!)它仅在3D坐标(真实世界!)中的对象是平面并且在Z = 0(校准摄像机的外部参数的点)时才有效 . 在这种情况下,此方法与校准一样精确 . 注意:为了获得最佳校准检查openCVs圆形校准,它的重新检测误差为0.018像素(由我大学的博士生测试) .

  • 0

    您可能已经发现了重新出现错误的错误 . 它与这一行有关:

    [x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2;
    

    要点[x2; Y2; 1]是模糊的,直到比例常数,C * [x2; Y2; 1]在这里,你通常不知道设置C = 1 . 可能性的位置在第一视图中表现为极线 . 您可以使用最小二乘三角剖分来找到3D点所在的最可能点,然后将重新投影的点计算为:

    [x1_; y1_; z1_] = K1*(R1*X + T1);
    

    如上所述,从那里开始 . 点 Cloud 中每个这样的点X的3D坐标可以使用其对应的标准化坐标(x1,y1),(x2,y2),...,以及相应的旋转矩阵和平移向量,通过格式化来计算进入矩阵问题:

    A X = b
    

    然后解决最小二乘:

    min |A X - b|_2
    

    这在第3页和第4页here中有说明 .

相关问题