opencv(37) 图像轮廓之六:创建包围轮廓的矩形和圆形边界框

1 边界矩形

轮廓检测中的边界矩形有两种,一种是直边界矩形,一种是旋转边界矩形,分别介绍如下:

1.1 cv2.boundingRect(cnt)直边界矩形

一个直矩形,没有进行旋转。

它不会考虑对象是否旋转,所以该边界矩形的面积不是最小的。可以使用函数cv2.boundingRect()查找得到的。

x,y,w,h = cv2.boundingRect(cnt)

img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

返回值中,(x,y)是矩阵左上角的坐标,(w,h)是举行的宽和高。

1.2 cv2.minAreaRect()旋转边角矩形

这个边界矩形是面积最小的,他考虑了对象的旋转。

用函数cv2.minAreaRect(),返回的是一个Box2D结构,其中包含矩形左上角角点的坐标(x,y),以及矩形的宽和高(w,h),以及旋转角度。但是要绘制这个矩形需要矩形的4个角点。可以通过函数cv2.boxPoints()获得。

s = cv2.minAreaRect(cnt)

a = cv2.boxPoints(s)

a = np.int0(a)#必须转换a的类型为int

cv2.polylines(im,[a],True,(0,0,255),3)

2 cv2.minEnclosingCircle()最小外接圆

最小外接圆是对象的外切圆,它是所有包含目标对象的圆中面积最小的一个,我们使用函数cv2.minEnclosingCircle()获取最小外接圆。

3 示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 1 图像读取
img = cv2.imread('C:/Users/xxx/Downloads/arrow.png')
img2 =img.copy()
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 2 转换为二值图
ret,thresh = cv2.threshold(imgray,127,255,0)

# 3 轮廓提取
contours, hierarchy = cv2.findContours(thresh,1,2)

# 4 将轮廓绘制在图像上
temp = np.zeros(img.shape, np.uint8)  # 生成黑背景
img1 = cv2.drawContours(temp, contours, -1, (0,0,255), 2)
cnt=contours[0]

# 5 边界矩形
# 5.1 直边界矩形
x,y,w,h = cv2.boundingRect(cnt)
img2 = cv2.rectangle(img2,(x,y),(x+w,y+h),(0,255,0),3)

# 5.2 旋转边界矩形结果
s = cv2.minAreaRect(cnt)
a = cv2.boxPoints(s)
a = np.int0(a)#转换a的类型为int型
img2= cv2.polylines(img2,[a],True,(0,0,255),3)

# 6 最小外接圆
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img2 = cv2.circle(img2,center,radius,(255,0,0),2)
 
# 7 图像显示
names = ['原图','轮廓检测结果','边界矩形和外接圆']
images =  [img,img1,img2]

plt.figure(figsize=(25.6,9.6))
for i in range(1):
    for j in range(3):
        plt.subplot(1,3,i*3+j+1),plt.imshow(images[i*3+j])
        plt.title(names[i*3+j],fontsize=30), plt.xticks([]), plt.yticks([])
        num=i*3+j
        if num >= len(names)-1:
            break

plt.show()

 运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值