我有许多校准过的相机拍摄平面场景的照片.为简单起见,我们假设有3个摄像头.那些相机正在进行一般运动,但主要是翻译加上一些温和的旋转.相机的示例位置
任务是完全缝合它们.我不了解3D坐标,只是用校准相机拍摄的一组图像.
我所做的:
我在OpenCV中使用SURF/SIFT实现检测特征,通过在每对图像之间使用findHomography来获得初始单应性(1-> 2,2- > 3,1- > 3).从那些单应性我得到每个相机的姿势的初始esitimation (类似的程序到此)
然后我尝试使用束调整技术来最小化每个匹配对的重投影错误.优化参数是三个平移值和三个旋转值(从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_;
Run Code Online (Sandbox Code Playgroud)
要么
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)
Run Code Online (Sandbox Code Playgroud)
其中r__是R1矩阵的元素,两个内在矩阵都是
[f 0 0]
[0 f 0]
[0 0 1]
Run Code Online (Sandbox Code Playgroud)
我假设参考帧的Z2坐标为1.
下一阶段是使用所获得的相机矩阵(K1,R1,T1,K3,R3,T3)将图像#1和#3变形为图像#2的公共坐标系.
问题是我不知道正确重投影到图像#2的参考帧所需的Z1和Z3,因为来自图像#1 - …
opencv computer-vision photogrammetry perspectivecamera image-stitching