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:
breakplt.show()
运行结果如下: