Python 用ConvexHull检测矩形(四边形)

Python 用ConvexHull检测矩形(四边形),python,opencv,image-processing,geometry,Python,Opencv,Image Processing,Geometry,我想从图像中检测矩形 我使用cv2.findContours和cv2.convexHull来过滤不规则多边形 之后,我将使用外壳的长度来确定轮廓是否为矩形 hull = cv2.convexHull(contour,returnPoints = True) if len(hull) ==4: return True 但是,有时convexHull将返回长度为5的数组。 如果我使用上面的标准,我将错过这个矩形 比如说,, 使用cv2.canny后 通过使用上述方法,我将获得外壳:

我想从图像中检测矩形

我使用cv2.findContours和cv2.convexHull来过滤不规则多边形

之后,我将使用外壳的长度来确定轮廓是否为矩形

hull = cv2.convexHull(contour,returnPoints = True)
if len(hull) ==4:
    return True
但是,有时convexHull将返回长度为5的数组。 如果我使用上面的标准,我将错过这个矩形

比如说,,

使用cv2.canny后

通过使用上述方法,我将获得外壳:

 [[[819 184]]

 [[744 183]]

 [[745 145]]

 [[787 145]]

 [[819 146]]]
这里是我的问题:给定一个长度为5的数组凸包,我如何确定它是否实际上是指一个四边形?多谢各位

===================================================================== 更新:

使用Sobel X和Y方向后

sobelxy = cv2.Sobel(img_inversion, cv2.CV_8U, 1, 1, ksize=3)
我得到: 嗯, 这不是提取矩形的正确方法。由于我们在这里讨论的是基础知识,我建议您对图像进行反转,并在X和Y方向应用Sobel,然后运行findcontours函数。这样你就可以得到很多可以过滤掉的矩形。您必须应用大量检查来识别包含文本的矩形。我也不明白为什么要强制选择长度为5的矩形。你是在限制规模

其次,另一种方法是使用Sobel X和Y图像,然后应用OpenCVs LineSegmentDetector。一旦你得到了所有的线段,你就必须应用RANSAC进行四边形拟合,所以这里的条件应该是一组随机选择的相交线上的所有角度都应该是准确的,最后用文本过滤掉四边形roi,以便使用SWT或其他可靠的技术

至于您的查询,您应该选择长度理想为4点的四边形

参考:

此链接将以非常简单的方式为您提供检测矩形的jist

下面的图像为您提供了一种图像反转和sobel的演练。图像反转消除了从sobel获得的双重边界

对于反转,使用波浪形操作符

同样在进行反转之前,最好抑制照明瑕疵。这可以使用同态滤波来完成。或者拍摄图像的日志。

嗯, 这不是提取矩形的正确方法。由于我们在这里讨论的是基础知识,我建议您对图像进行反转,并在X和Y方向应用Sobel,然后运行findcontours函数。这样你就可以得到很多可以过滤掉的矩形。您必须应用大量检查来识别包含文本的矩形。我也不明白为什么要强制选择长度为5的矩形。你是在限制规模

其次,另一种方法是使用Sobel X和Y图像,然后应用OpenCVs LineSegmentDetector。一旦你得到了所有的线段,你就必须应用RANSAC进行四边形拟合,所以这里的条件应该是一组随机选择的相交线上的所有角度都应该是准确的,最后用文本过滤掉四边形roi,以便使用SWT或其他可靠的技术

至于您的查询,您应该选择长度理想为4点的四边形

参考:

此链接将以非常简单的方式为您提供检测矩形的jist

下面的图像为您提供了一种图像反转和sobel的演练。图像反转消除了从sobel获得的双重边界

对于反转,使用波浪形操作符


同样在进行反转之前,最好抑制照明瑕疵。这可以使用同态滤波来完成。或者拍摄一幅图像的日志。

将一个矩形与一个凸多边形相匹配并不容易

您可以尝试通过旋转卡尺来找到最小面积或最小周长矩形


然后,通过比较船体和矩形的面积/周长,您可以评估矩形的角度。

将矩形拟合到凸多边形并非易事

您可以尝试通过旋转卡尺来找到最小面积或最小周长矩形


然后通过比较船体和矩形的面积/周长,您可以评估矩形。

这是一个检测车牌的非常糟糕的解决方案。你应该找一些更健壮的东西。@Miki你对此有什么建议吗?你可以从它开始。这是个好主意,但它每月只免费1500次。我正在用汽车摄像头进行实时识别。它是开源的,你可以看到里面发生了什么,然后自己制作。此外,您只需为云服务付费。这是一个检测车牌的非常糟糕的解决方案。你应该找一些更健壮的东西。@Miki你对此有什么建议吗?你可以从它开始。这是个好主意,但它每月只免费1500次。我正在用汽车摄像头进行实时识别。它是开源的,你可以看到发生了什么

去那里,做你自己的。此外,您只需支付云服务的费用。谢谢您的回复。车牌的轮廓长度为5。这就是我选择长度为5的原因。findContours需要一个二值图像,所以要么你设置Sobel震级的阈值,要么它没有意义。在进行反转后,我无法获得相同的Sobel图像。使用SoeLyXy=Cv2.SoimiGrimeRead,CV2.CVY8U,1, 1,KSype=1是否正确?对不起,我在Python上不擅长,我是C++的家伙。但据我所知,内核大小不是=1,而是应该=3@AnubhavRohatgi不过,我还是得到了一个错误的图像。更新了问题中的图像谢谢您的回复。车牌的轮廓长度为5。这就是我选择长度为5的原因。findContours需要一个二值图像,所以要么你设置Sobel震级的阈值,要么它没有意义。在进行反转后,我无法获得相同的Sobel图像。使用SoeLyXy=Cv2.SoimiGrimeRead,CV2.CVY8U,1, 1,KSype=1是否正确?对不起,我在Python上不擅长,我是C++的家伙。但据我所知,内核大小不是=1,而是应该=3@AnubhavRohatgi不过,我还是得到了一个错误的图像。更新了问题中的图像我想强制使用四边形,但是我从python opencv获得的一些近似轮廓有>4条边。我尝试在例如16边多边形上再次运行cv2.approxPolyDP,但不起作用。有什么想法吗?@jtlz2:你可以通过旋转卡钳来找到最小面积或最小周长的矩形。这是一个四边形,而不是一个必需的矩形。@jtlz2:你的文章大部分是基于矩形的。@jtlz2:对于汽车牌照来说,找到一个矩形就足够了。如果您坚持,您可以找到外壳的四条最接近矩形的边并将其延伸。我想强制执行四边形,但我从python opencv中获得的一些近似轮廓具有>4条边。我尝试在例如16边多边形上再次运行cv2.approxPolyDP,但不起作用。有什么想法吗?@jtlz2:你可以通过旋转卡钳来找到最小面积或最小周长的矩形。这是一个四边形,而不是一个必需的矩形。@jtlz2:你的文章大部分是基于矩形的。@jtlz2:对于汽车牌照来说,找到一个矩形就足够了。如果您坚持,您可以找到外壳的四条最靠近矩形的边并将其延伸。