C++ 最小化单应矩阵的误差

C++ 最小化单应矩阵的误差,c++,opencv,homography,minimization,C++,Opencv,Homography,Minimization,我有一个homgraphy矩阵 [h1 h2 h3 h4 h5 h6 h7 h8 h9] 我改变了一个观点 p1到p1使用上述单应矩阵。 同样地 p2 to P2 p3 to P3 p4 to P4 我知道两者的区别 P1-P2 = D1 P2-P3 = D2 P3-P4 = D3 由于单应性误差,D1、D2、D3中存在小误差。 (我知道实际的差值) 让错误为E1、E2、E3(已知值) 类似地,计算E2、E3和E4 现在我需要修改我的单应矩阵,以便我的

我有一个homgraphy矩阵

 [h1 h2 h3 
  h4 h5 h6 
  h7 h8 h9]
我改变了一个观点
p1到p1
使用上述单应矩阵。 同样地

    p2 to P2
    p3 to P3
    p4 to P4
我知道两者的区别

P1-P2 = D1
P2-P3 = D2
P3-P4 = D3
由于单应性误差,D1、D2、D3中存在小误差。 (我知道实际的差值) 让错误为E1、E2、E3(已知值)

类似地,计算E2、E3和E4


现在我需要修改我的单应矩阵,以便我的E1、E2、E3、E4最小化。

简介:

单应可以从4对点获得100%的精度(真实0重投影误差)。但是,当点对的数量超过4时,可能无法获得0误差单应。这是因为这些点可能不在一个三维刨床中

因此,首先您必须处理这样一个事实:在实际的word应用程序中,可能没有100%准确的单应性(由于匹配错误),但有一个最佳(最小重投影错误矩阵)

配方:

关于你的问题,你似乎有两套观点。一个用于获取单应性,另一个用于基于单应性验证模型,然后用于增强模型

如何增强单应性?

首先,使用两个集合,使用一些鲁棒估计方法(例如RANSAC)获得单应性。你可以找到更多的信息

其次,遍历集合,并按照描述计算每个点的重投影错误。然后,消除所有重投影误差超过某个阈值的点

第三,仅在内联线上应用微调优化技术,直到在内联线之间的误差总和方面获得良好的单应性

如何执行第三步?

您有8个参数需要优化:

h11    h12    h13
h21    h22    h23
h31    h32     1
优化功能:

您已经使用RANSAC计算了单应性。因此,您有一个非常好的估计,它接近全局最优值。这意味着对于这种情况,非线性局部优化技术就足够了。存在许多算法。选择一个并开始(一些建议:,)


在OP的评论后编辑只有第二组之间的距离是已知的:

优化功能应为:

其中,
AD_ij
是Pi和Pj之间的实际距离


您可以尝试降低复杂性,例如在参考和查询中使用欧几里德距离序列。

对于某些(第二组)点,我不知道变换后的确切位置。但这些点经过变换后,我知道它们之间的精确欧几里德距离。我想用这些信息来改进单应矩阵。谢谢。如何在MATLAB或八度表或C++中实现这一C++库是好的和简单的。如果你面对一个特定的问题,你可以在一个单独的问题中提问。
h11    h12    h13
h21    h22    h23
h31    h32     1