Python 如何从矩形列表中标识直线

Python 如何从矩形列表中标识直线,python,opencv,image-processing,Python,Opencv,Image Processing,我的目标是确定4个相交点并进行透视变换 给定一个计算矩形列表[x,y,w,h](从等高线导出),如何找到一张纸的4条最佳线条 这使用minareact查找非白色像素区域,但在我的例子中,环境非常嘈杂,即使应用了广泛的图像处理算法,也不可能消除所有白点 这是我的处理管道 灰度和二值化 应用形态学操作删除不太可能的字符 使用一组规则(实验值)查找轮廓 我现在正在考虑一种方法,首先找到4条线(左、上、右和下),然后进行反求,得到4个相交点 这可能吗 理想的结果是这样的,可以确定四点 更新1

我的目标是确定4个相交点并进行透视变换

给定一个计算矩形列表
[x,y,w,h]
(从等高线导出),如何找到一张纸的4条最佳线条

这使用
minareact
查找非白色像素区域,但在我的例子中,环境非常嘈杂,即使应用了广泛的图像处理算法,也不可能消除所有白点

这是我的处理管道

  • 灰度和二值化
  • 应用形态学操作删除不太可能的字符
  • 使用一组规则(实验值)查找轮廓
我现在正在考虑一种方法,首先找到4条线(左、上、右和下),然后进行反求,得到4个相交点

这可能吗

理想的结果是这样的,可以确定四点

更新1

正在尝试将矩形列表转换为点。我只能在这个阶段使用矩形,因为以前的操作不再返回轮廓

def rectsToPoints(rects):

    points = []

    for x1, y1, x2, y2 in rects:
        x, y, w, h = x1, y1, x2-x1, y2-y1

        points.append([
            (x, y),
            (x+w, y),
            (x, y+h),
            (x+w, y+h)
        ])

    return np.array(points, dtype=np.int32)

points = rectsToPoints(rects)
minRect = cv2.minAreaRect(points)
类型错误

cv2.error: OpenCV(3.4.3) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/convhull.cpp:137: error: (-215:Assertion failed) total >= 0 && (depth == CV_32F || depth == CV_32S) in function 'convexHull'

请参阅。将每个矩形的四个顶点放在一个点列表中,并使用
minareact
@Miki让我试试,这四个点是否需要遵循顺序?@zindarod您共享的答案很好!它使用4个最大的轮廓作为参考点,对吗?但在我的例子中,我无法提取这四个相关的参数contour@RexLow不需要点积分