OpenCV学习笔记-边界矩形

有两类边界 矩形,直边界 矩形和旋转的边界 矩形
直边界 矩形:一个直矩形(就是没有旋转的矩形)。它不会考虑对象是否旋转。所以边界 矩形的面积不是最小的。使用函数cv.boundingRect()查找得到。

(x, y)为 矩形左上角的坐标,(w, h)是 矩形的宽和高。
x, y, w, h = cv.boundingRect(contour)
img = cv.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
旋转的边界 矩形:这个边界 矩形的面积是最小的,因为它考虑了对象的旋转。我们用cv.minAreaRect()生成最小外接 矩形。返回的是一个Box2D结构,其中包含了矩形左上角角点的坐标(x, y), 矩阵的宽和高(w, h),以及旋转角度。但是要绘制这个矩形需要矩形的四个角点,可以通过函数cv.boxPoints()获得。box:[[x1, y1],[x2, y2],[x3, y3],[x4, y4]]

最小外接矩形的4个顶点顺序、中心坐标、宽度、高度、旋转角度(是度数形势,不是弧度数)的对应关系如下:
                                   上图及下面的话借鉴lanyuelvyun的博客

注意:旋转角度θ是水平轴(x轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是width,另一个边的边长是height。也就是说,在这里,width与height不是按照长短来定义的。
在OpenCV中, 坐标系原点在左上角,相对于X轴,逆时针旋转角度为负,顺时针旋转角度为正。在这里,θ∈(-90,0]

具体代码,这里的步骤一步不能少:
 
  
rect = cv.minAreaRect(contour) #[(x,y),(w,h),angle]
print(rect)
box = cv.boxPoints(rect) #获取到最小矩阵的四个顶点box:[[x1, y1],[x2, y2],[x3, y3],[x4, y4]]
box = np.int0(box) #对box进行处理 这一步一定要进行
print(box)
cv.drawContours(img, [box], i, ( 0, 255, 0), 1) # [box]

打印出结果:
rect: 
((256.45806884765625, 202.82794189453125), (252.86923217773438, 124.39171600341797), -42.386653900146484)
box:

[[205.       334.      ]
 [121.143776 242.12273 ]
 [307.91614   71.65588 ]
 [391.77237  163.53316 ]]
我们必须要把结果转成整型:

[[205 334]
 [121 242]
 [307  71]
 [391 163]]
现在来看看效果吧

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/80459604