如何找到最佳四边形以逼近OpenCV轮廓?

4

我有一个OpenCV轮廓c,它的形状接近四边形,但它可以有4到数十个点。

我想找到最接近轮廓c的四边形q(一种方法是最小化它们之间差异的面积)。

我目前使用的是

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

但结果并不总是一个四边形。我已经尝试过像cv2.approxPolyDP(),cv2.arcLength()这些方法如何强制approxPolyDP()只返回最佳的4个角点?-Opencv 2.4.2(例如二分查找),但它并不总是产生四边形。

还有其他方法(可能使用除了approxPolyDP以外的东西)来找到轮廓的最佳四边形逼近吗?

注意:另一个相关问题是基于最大四边形轮廓裁剪图像OpenCV,但它没有解决此问题。


确实更困难。 - user1196549
看看各种AR标记使用的算法和它们的检测方法。不,OpenCV没有一个简单可用的函数来保留边缘(并推断真正的角点)。approxPolyDP是旧东西,它“保留”角点,但完全破坏(移动)了边缘。也许有人应该做一个GSoC项目,实现其中一些方法,或者从aruco代码中重构相关部分。它有一些改进方法(如apriltag等)。 - undefined
1
@Y_Z,你能发一篇带有示例代码的回答吗?这可能是一个很好的解决方案! - undefined
请发布您的输入图片。我们需要看一个例子! - undefined
请访问https://www.researchgate.net/publication/303329343_Least-squares_Fitting_of_Polygons。 - undefined
显示剩余4条评论
1个回答

2
我最近遇到了一个类似的问题,但是与其用一个普通的四边形来近似轮廓,我尝试用一个矩形来近似它。希望我的解决方案对你的问题也有帮助。

我使用了cv.minAreaRect方法。这个方法可以找到一组点的最小面积包围的旋转矩形。 在Python的OpenCV中,一个旋转矩形由(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() 返回了相当不错的近似值。希望对你也是一样的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接