【发布时间】:2013-02-19 15:20:19
【问题描述】:
我有许多经过校准的相机拍摄平面场景的照片。为简单起见,我们假设有 3 个摄像头。这些摄像机正在进行一般运动,但主要是平移加上一些轻微的旋转。 Example positions of cameras
任务是将它们完全缝合。我对 3D 坐标一无所知,只是使用校准相机拍摄的一组图像。
我做什么:
我在 OpenCV 中使用 SURF/SIFT 实现检测特征,通过在每对图像 (1->2, 2->3, 1->3) 之间使用 findHomography 来获得初始单应性。从这些单应性中,我得到了每个相机姿势的初步估计(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 在他们的拼接模块中有非常相似的框架,但它是在纯旋转运动的假设下运行的,这不是这里的情况。
【问题讨论】:
-
您考虑过 3D 三角测量吗?例如,您可以使用除一个摄像头以外的所有摄像头对一个点进行三角测量,然后在最后一个摄像头中重新投影。
标签: opencv computer-vision perspectivecamera image-stitching photogrammetry