我怎样才能只得到一个旋转矩形的四个角?

Posted

技术标签:

【中文标题】我怎样才能只得到一个旋转矩形的四个角?【英文标题】:How can i get only the four corners of a rotated rectangle? 【发布时间】:2020-06-18 16:24:53 【问题描述】:

我正在使用此代码来检测矩形的四个角,但是由于像素波,我得到了下面的输出,这意味着我得到了很多点,我怎样才能只得到 4 个角(topRight、topLeft、bottomRight、bottomLeft ) 而不是所有的像素波?

注意我在 python 中使用 opencv

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
low_red1 = np.array([0,70,25])
high_red1 = np.array([10,255,255])

low_red2 = np.array([160,70,25])
high_red2 = np.array([180,255,255])

mask0 = cv2.inRange(hsv, low_red1, high_red1)
mask1 = cv2.inRange(hsv, low_red2, high_red2)
mask = mask0+mask1
cv2.imshow("mask", mask)

contours,_ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,200,0),1)

for c in contours:
    approx = cv2.approxPolyDP(c, 0.009 * cv2.arcLength(c, True), True)    
    cv2.drawContours(img, [approx], 0, (255, 0, 0), 1)
    n = approx.ravel()
    k = 0
    for j in n :
        if(k % 2 == 0):
            x = n[k]
            y = n[k + 1]
            cv2.circle(img, (x,y), 3, (255, 0, 0), -1)    
        k = k+1

cv2.imshow("corners", img)

the output

【问题讨论】:

见 cv2.minAreaRect() 得到旋转后的矩形角点 @fmw42 但它们不完全是矩形,它们是平行四边形,因此 minAreaRect 不会绘制完全适合的矩形 @fmw42 我尝试使用此功能,它给了我四个角,但这些并不总是准确的点,但谢谢它帮助了我 您可以在附近搜索矩形上的像素,并找到定位角点的最大值和最小值。另请参阅docs.opencv.org/4.1.1/dd/d1a/… 的角点检测 好的,非常感谢 【参考方案1】:

除非矩形与您的 uv 轴完全对齐(您可以检查),角落始终是单独的 max()min() 值沿着 uv坐标。

【讨论】:

以上是关于我怎样才能只得到一个旋转矩形的四个角?的主要内容,如果未能解决你的问题,请参考以下文章

获取旋转的矩形 UIView 角的坐标 iOS

OpenCV-绘制旋转矩形

如何在arcgis中对已知的四个点划外接矩形

查找矩形内的所有点?

从旋转的矩形计算边界框坐标

ps5用裁剪工具拖动四个角的点,怎么防止图像变形。