从平面点形成一个矩形

问题描述

我有一组红线,从中可以得到一组绿色的交点(在屏幕上可见):

enter image description here

然后我想找到最有可能描述矩形的四个点(如果有多个选项,则选择最大的区域)。我阅读了有关如何找到完全形成矩形的点的类似问题:

find if 4 points on a plane form a rectangle?

https://softwareengineering.stackexchange.com/questions/176938/how-to-check-if-4-points-form-a-square

一个选项可以迭代所有四个点并计算它们形成矩形的概率(或与矩形的某个相似系数)。假设目前我们正在考虑四个点 A、B、C、D。我尝试了 2 个相似度函数

  1. enter image description here

    ,

其中 表示点积,而 || - 向量范数。

  1. List item

    ,

其中 std 是顶点到假定矩形质心的距离的标准差,mean 是平均距离。

这两个功能都表现不佳。

有没有办法引入一个函数,当平面的四个点靠近矩形的顶点时接近1,在离矩形最远的位置时等于0(假设它们在1 行)?

解决方法

我真的不能说找到一个合适的成本函数来对“好”矩形进行评分。从评论来看,似乎有很多讨论,但没有达成共识。所以现在我将只使用一个评分函数,该函数会惩罚具有远离 90 度的角度的四点形状。具体来说,我正在对平方距离求和。如果您想使用不同的评分指标,您可以替换 scoreFunc 函数中的计算。

我设置了一个交互式窗口,您可以在其中单击以添加点。当您按“q”时,它将获取这些点数,找到 4 点的所有可能组合(不是排列),然后对每个点运行评分函数并得出最好的。

我正在使用递归的蛮力搜索。为了避免大量重复,我想出了一个无论顺序如何都可以工作的散列函数。我使用素数来标识每个点,散列函数只取点的 ID 的乘积。这确保 (1,3,5,7) 与 (3,1,7,5) 相同。我使用素数是因为素数的乘积在这种情况下是唯一的(因为它们是素数,所以不能分解和成簇)。

搜索后,我必须确保点的排序方式使线不相交。我正在利用 OpenCV 的 contourArea 为我进行计算。我可以将第一个点与它的水平和垂直邻居交换,并将这些区域与原始区域进行比较。相交线的“领结”形状的面积(我很确定它们实际上会得到零面积,因为它们不算作闭合形状)比非相交形状的面积小。

enter image description here

enter image description here

enter image description here

{{1}}