Image 如何从一个内在参数移动到另一个?

Image 如何从一个内在参数移动到另一个?,image,Image,给定两个摄像机的固有参数,如何从一个固有参数移动到另一个?假设两个摄像机矩阵都有。我将M1设置为640x480,水平视场为60度,M2设置为1280x720,水平视场为80度。我将使用numpy和python进行计算 >>> M1 = np.eye(3) >>> M1[0:2,2] = (640/2, 480/2) >>> M1[0,0] = M1[1,1] = (640/2) / atan(60/2 * pi/180) >>&g

给定两个摄像机的固有参数,如何从一个固有参数移动到另一个?

假设两个摄像机矩阵都有。我将M1设置为640x480,水平视场为60度,M2设置为1280x720,水平视场为80度。我将使用numpy和python进行计算

>>> M1 = np.eye(3)
>>> M1[0:2,2] = (640/2, 480/2)
>>> M1[0,0] = M1[1,1] = (640/2) / atan(60/2 * pi/180)
>>> M1
array([[663.42156,   0.     , 320.     ],
       [  0.     , 663.42156, 240.     ],
       [  0.     ,   0.     ,   1.     ]])

>>> M2 = np.eye(3)
>>> M2[0:2,2] = (1280/2, 720/2)
>>> M2[0,0] = M2[1,1] = (1280/2) / atan(80/2 * pi/180)
>>> M2
array([[1050.09103,    0.     ,  640.     ],
       [   0.     , 1050.09103,  360.     ],
       [   0.     ,    0.     ,    1.     ]])
这样的矩阵将点从3D映射到图像平面上。我们可以通过与逆矩阵相乘来扭转这个方程。现在您可以将图像平面上的该点“投影”回空间。它不会有一个有意义的距离,但角度是正确的

现在,您可以乘以第二个摄影机矩阵来“重新投影”该点。将矩阵分组并将它们相乘为一。这就是你要使用的矩阵


这不是完全的单应性。它甚至不是完全仿射变换。它仅包含图像平面中的平移和缩放。您可以将其插入
cv::warpAffine
(切掉第三行,以便OpenCV接受它)。

您指的是哪些内在参数?摄像机投影矩阵中的那些,或者畸变系数?请注意,该解决方案仅在理论上适用于无穷远处的点。实际上,靠近摄影机的场景点不会正确扭曲。如果两个摄影机具有相同的光学中心,则会正确扭曲,他在现已删除的注释中指定了该光学中心。本质的改变并不取决于任何场景点的距离。除了传感器分辨率的影响:-)用广角镜头拍摄1公里外的建筑物的墙壁。扭曲它来模拟一张长焦照片:这座建筑看起来不像是用真正的长焦照片拍摄的,对吗?这就是为什么要写“理论”和“实践”。我看不出你的批评。无论是“无限远”点还是“靠近摄影机的点”,都将在理论上和实践上正确映射。当然,从角度分辨率低得多的全景照片中提取长焦照片的细节在理论上和实践上都是不可能的,但这并不是你在第一条信息中的批评。请随时澄清您在第一条评论中所写的内容。我不相信是那样的。
>>> M2 @ np.linalg.inv(M1)
array([[  1.58284,   0.     , 133.49079],
       [  0.     ,   1.58284, -19.88191],
       [  0.     ,   0.     ,   1.     ]])