Python OpenCV基本矩阵内插器
我有一组来自两幅图像的对应点。使用这些和我的相机内部函数,我使用Python OpenCV基本矩阵内插器,python,opencv,computer-vision,pose-estimation,Python,Opencv,Computer Vision,Pose Estimation,我有一组来自两幅图像的对应点。使用这些和我的相机内部函数,我使用cv2.findesentialmat计算基本矩阵,使用严格的阈值。这将返回E和inliners 这是我的问题。我想使用一个较紧的阈值来估计E,但是,我想找到位于稍宽的阈值区域中的点 根据理论,如果点x和x'是对应的,那么x'.T@K^-T@E@K^-1@x=0(等式1)。因此,使用估计的E,如果我对每个点对应执行此操作,理论上应该给出每个点的误差,并且我可以将内线估计为位于某个误差值内的点 然而,从cv2.findesential
cv2.findesentialmat
计算基本矩阵,使用严格的阈值。这将返回E
和inliners
这是我的问题。我想使用一个较紧的阈值来估计E
,但是,我想找到位于稍宽的阈值区域中的点
根据理论,如果点x
和x'
是对应的,那么x'.T@K^-T@E@K^-1@x=0
(等式1)。因此,使用估计的E
,如果我对每个点对应执行此操作,理论上应该给出每个点的误差,并且我可以将内线估计为位于某个误差值内的点
然而,从cv2.findesentialMat
估算的内联线与该公式之间似乎没有相关性。我知道cv2。FindSentialMat使用不同的误差(Sampson误差,这是一阶近似值),因此,哪个是内联线的更真实的度量
样本:
假设从一个给定的300
通信中,这里是我的E
E = np.asarray([[-1.90703391e-03, -7.07017221e-01, 6.96654064e-03],
[ 7.06991016e-01, -1.85637111e-03, 1.15511153e-02],
[-5.20266398e-03, -8.61635827e-03, 4.11652184e-07]])
在接下来的几行中,每一行都包含以下顺序的-来自eqn1的错误
,inlier
,x
,x'
(几个对应)
可以看出,eqn1的误差与cv2.findesentialmat
的误差之间似乎没有相关性。因此,从三角测量的角度来看,哪种度量更适合去除异常值?您可以先使用更宽的阈值来估计E,然后只取内联线并再次估计E并重复。我这样做过一次,以改进基本矩阵计算。
[[-0.00019274]] 0 [267. 86. 1.] [204. 72. 1.]
[[0.00048806]] 0 [274. 138. 1.] [214. 135. 1.]
[[6.73487966e-06]] 0 [277. 89. 1.] [216. 76. 1.]
[[-0.00044746]] 1 [380. 93. 1.] [356. 86. 1.]
[[-0.00053107]] 0 [384. 116. 1.] [361. 111. 1.]
[[-0.00020068]] 0 [387. 98. 1.] [363. 92. 1.]
[[-0.00019009]] 0 [387. 108. 1.] [363. 103. 1.]
[[-6.01717538e-05]] 0 [392. 85. 1.] [368. 78. 1.]
[[-1.74641035e-05]] 0 [392. 124. 1.] [368. 121. 1.]
[[4.83028302e-05]] 0 [396. 103. 1.] [372. 98. 1.]
[[-0.0002719]] 0 [397. 119. 1.] [375. 115. 1.]
[[-0.00031985]] 0 [403. 61. 1.] [379. 50. 1.]
[[-0.00013948]] 0 [407. 51. 1.] [384. 40. 1.]
[[-7.80137547e-05]] 0 [406. 155. 1.] [385. 155. 1.]
[[0.00010276]] 1 [407. 115. 1.] [386. 112. 1.]
[[0.0002215]] 1 [410. 135. 1.] [388. 134. 1.]