c++ - 最小化单应矩阵中的误差

标签 c++ opencv homography minimization

我有一个单应矩阵

 [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(已知值)。

(E1 = D1 - Actual_Difference_between_P1_andP2)

同样计算E2、E3、E4。

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

最佳答案

简介:

可以从 4 对点获得单应性,准确率为 100%(真正的 0 重投影误差)。但是,当点对的数量超过 4 个时,您可能无法获得 0 错误的单应性。这是因为这些点可能不在一个 3D 平面中。

因此,首先你必须处理这样一个事实,即在实际应用中,可能没有 100% 准确的单应性(由于匹配误差),但有一个最优的(最小重投影误差矩阵)。

配方:

关于你的问题,你似乎有两组对点。一个是您用来获取单应性的,另一个是您正在基于它验证您的模型,然后您想使用它来增强您的模型。

如何增强单应性?

首先,使用这两个集合使用一些稳健的估计方法(例如 RANSAC)获得单应性。您可能会找到更多信息 here .

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

第三,仅对内点应用微调优化技术,直到根据内点之间的误差总和获得良好的单应性。

第三步怎么做?

您有 8 个参数需要优化:

h11    h12    h13
h21    h22    h23
h31    h32     1

优化函数:

enter image description here

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


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

优化函数应该是: enter image description here

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

您可以尝试降低复杂性,例如使用欧几里德距离的sequare作为引用和查询。

关于c++ - 最小化单应矩阵中的误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42152764/

相关文章:

image-processing - 如何转换图像?

image - 将像素排序为中值过滤器

android - Feature2d + Homography Java实现

c++ - 规范化时避免奇怪的单应性值

c++ - switch 中的 throw 语句

Java opencv inRange阈值函数使我的图像变成三个不同的图像?

c++ - C 中的左值必需错误

java - OpenCV:WarpPerspective 函数的参数是什么?

c++ - 什么是聚合初始化

c++ - 仅将命名空间用于初始化列表