C++ 我们如何确认内在矩阵是正确的?

C++ 我们如何确认内在矩阵是正确的?,c++,opencv,aruco,C++,Opencv,Aruco,我使用阿鲁科标记进行了摄像机校准。因为内在矩阵是K=[fx 0 cx;0 fy cy;0 0 1],其中fx=image\u width/2和fy=image\u height/2。我进行了两次校准,结果如下: 案例1 camera_matrix: !!opencv-matrix rows: 3 cols: 3 dt: d data: [ 1.7837087835808685e+004, 0., 9.4648597205501767e+002, 0., 1.

我使用阿鲁科标记进行了摄像机校准。因为内在矩阵是
K=[fx 0 cx;0 fy cy;0 0 1]
,其中
fx=image\u width/2和fy=image\u height/2
。我进行了两次校准,结果如下:

案例1

camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 1.7837087835808685e+004, 0., 9.4648597205501767e+002, 0.,
       1.7846680517567835e+004, 6.2655678552312384e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ 1.3214125616841757e-001, 1.3720591379476604e+001,
       4.1379706976846960e-003, 3.2630160993931338e-002,
       7.2446581087476508e-002 ]
案例2

camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 3.9925887362481939e+004, 0., 9.6015637557091463e+002, 0.,
       3.5268399261164773e+003, 5.9886507612381956e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ 4.4338539084399781e-001, 4.9217843346948866e+000,
       5.8004377137432547e-002, 1.1762688789809046e-004,
       -5.4097967557812456e+002 ]
图像的分辨率为1920*1200,因此
cx
cy
应分别为960和600。 在第二种情况下,
cx
cy
与预期一致;重投影误差较大。在另一种情况下,
cx
cy
不匹配,但重投影误差很低(小于1)


那么,现在哪些结果可以被认为是最好的,以及一般如何定义
fx
fy
呢?

您认为cx和cy应该接近960和600是正确的。从这个角度来看,案例2似乎更有可能,但案例1的中心点(946626)显然是合理的

更令人惊讶的是获得的焦距参数。对于焦距对来说,(1783717846)和(399253526)似乎都不合理。根据经验,fx参数应与像素宽度(在本例中为1920)相匹配,在2x的范围内(例如,iPhone 5S的fx~=0.8*像素宽度)。fy应在1.2倍左右的系数范围内匹配外汇。对于情况1,fx偏离宽度的系数为10倍,对于情况2,fx和fy不匹配的系数为10倍


我建议尝试几个校准工具箱,并在其中任何两个工具箱之间寻找共识(比如让多个机械师检查您的汽车)。我推荐,这是OpenCV方法的先驱。

如果您仍然可以使用相机,我会说尝试拍摄更多图像并多次重复校准过程

正如@willem的回答中所提到的,使用将让你直观地看到拐角检测、电路板的3d位置,并帮助你扔掉嘈杂的图像。但是,Jean-Yves的工具箱只在棋盘上工作,需要手动输入包含正方形的ROI

如果您觉得aruco board没有提供高精度,您可以在opencv中尝试太多


我想说,以毫米为单位的焦距很难与像素焦距相关联,因为要做到这一点,你需要相机成像仪的尺寸。这通常不可用。

谢谢您提供的信息。但是他们想要追踪阿鲁科标记,所以我使用阿鲁科校准,我使用焦距镜头,焦距约35毫米,谢谢你的信息。电路板的检测结果良好,再投影误差小于0.2像素,表明校准良好。我甚至执行了多次校准,但我没有得到2x的fx或fy。如果使用opencv的
calibleCamera(..)
函数(,有一个标志可以对内在矩阵使用初始猜测,
CV\u CALIB\u use\u instructive\u guess
。如果你知道你期望的是什么,这可能会对你有所帮助。至少你可以尝试一些初始值。我没有遇到2x规则。所以,我对它了解不多。谢谢。校准没有鱼的相机吗眼睛效应会导致更多的失真?还是会改善图像?