如何找到近似OpenCV轮廓的最佳四边形?

l5tcr1uw  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(168)

我有一个OpenCV轮廓c,它的形状接近四边形,但它可以有4到几十个点的倍数。
我想找到最接近轮廓c的四边形q(一种方法可以是最小化它们之间的差异)。
我目前使用

q = cv2.approxPolyDP(c, 0.02 * cv2.arcLength(c, True), closed=True)

字符串
但结果是不总是一个四边形。我已经尝试过像cv2.approxPolyDP() , cv2.arcLength() How these worksHow to force approxPolyDP() to return only the best 4 corners? - Opencv 2.4.2中的技术(例如二分搜索),但它并不总是产生一个四边形。

是否有其他方法(可能使用approxPolyDP以外的其他方法?)来找到轮廓的最佳四边形近似?

注意:另一个链接的问题是Crop image based on largest quadrilateral contour OpenCV,但它没有给予这个问题的解决方案。

mfuanj7w

mfuanj7w1#

我最近遇到了一个类似的问题,但是我没有用一般的四边形来近似轮廓,而是试图用矩形来近似轮廓。我希望我的解决方案对你的问题也有帮助。
我使用了cv.minAreaRect方法。这个方法找到了一组具有最小面积的点的封闭Rotated Rectangle。在python opencv中,Rotated Rectangle是由(center_x, center_y), (width, height), angle_in_degrees构建的。我建议你检查this link,以避免对返回的angle_in_degrees值产生混淆,并获得有关“minAreaRect”方法的更多有用信息。
下面是“minAreaRect”方法的一个简单用法示例:

import cv2

def check_rectangle_approx(contour):
    rectangle = cv2.minAreaRect(contour)
    (center_x, center_y), (width, height), angle = rectangle

    return width * height - cv2.contourArea(contour) < SOME_THERSHOLD_VLAUE

字符串
在我的例子中,我有接近矩形的轮廓,minAreaRect()返回了不错的近似值。希望它对你也一样。

相关问题