在python中如何比较数组中的(x,y)点以提取矩形形状

在python中如何比较数组中的(x,y)点以提取矩形形状,python,opencv,numpy,scipy,Python,Opencv,Numpy,Scipy,我有一个numpy数组,它是从一张运行opencv的harris角点检测算法的图像中提取出来的,我正试图整理出四个类似矩形的点 以下是一组点: numpy.array([[194, 438], [495, 431], [512, 519], [490, 311], [548, 28], [407, 194], [181, 698], [169, 93], [408, 99], [221, 251], [395, 692],

我有一个numpy数组,它是从一张运行opencv的harris角点检测算法的图像中提取出来的,我正试图整理出四个类似矩形的点

以下是一组点:

numpy.array([[194, 438],
   [495, 431],
   [512, 519],
   [490, 311],
   [548,  28],
   [407, 194],
   [181, 698],
   [169,  93],
   [408,  99],
   [221, 251],
   [395, 692],
   [574, 424],
   [431, 785],
   [538, 249],
   [397, 615],
   [306, 237]])
什么是比较象限中角度的点(偏差在90以内)以及比较顶部和底部点与左侧和右侧点之间的平行线如何返回四个最佳候选点的最佳方法

编辑

图像与矩形大致对齐,因此没有明显的旋转或扭曲。我认为透视变换和粗略捕捉的偏差容差可以是+/-10度

下面是带有x和y位置的绘制线的图像。所需拐角为左上角(169,93)、右上角(408,99)、右下角(395692)和左下角(181698)

这可能不是找到角点的最有效方法,但我将点分成四个象限,如下所示:

yThreshM = height / 2
xThreshM = width / 2

tl = dst[ ((dst[:,1]<yThreshM) & (dst[:,0]<xThreshM)) ]
tr = dst[ ((dst[:,1]<yThreshM) & (dst[:,0]>xThreshM)) ]
br = dst[ ((dst[:,1]>yThreshM) & (dst[:,0]>xThreshM)) ]
bl = dst[ ((dst[:,1]>yThreshM) & (dst[:,0]<xThreshM)) ]
然后我计算垂直线的方向,并移除不在给定垂直阈值内的项目。然后我计算了角度,过滤掉了不在90度+/-阈值范围内的项目


最后,我检查通过
tlap
brap
迭代的结果的相对端点是否匹配,以获得其余的点,并验证
tl
br
点。

是“合适”的矩形矩形和屏幕边缘对齐,或者它们是旋转的还是扭曲的?这几乎是不可能回答的,除非你告诉我们你是如何定义矩形的“善”。平行度比90度角更重要吗?一个“矩形”有一个完美的90°角和一个非常差的角,比一个有两个普通角的“矩形”好吗?多少?你为什么不挤出额外的尺寸,然后在matplotlib中做一个散点图,以了解你正在使用的是什么?在x或y中没有重复项,因此没有矩形将与轴对齐。如果角度接近90,直线将平行。只检查四边形中的所有角度是否“接近”90的方法是否足够?您是否希望在此图像中找到一个近似矩形?
tla = [bl, tl, tr]
bra = [tr, br, bl]

tlap = list(it.product(*tla))
brap = list(it.product(*bra))