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]]

现在来看看效果吧

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值