边界框、最小矩形区域和最小闭圆的轮廓,详细注释
python-opencv书籍中这一小节的注释,作为一个新手小白,参考了其他人的注释,这个是我理解的
import cv2
import numpy as np
img = cv2.pyrDown(cv2.imread("test_picture/test_3.png", cv2.IMREAD_UNCHANGED))
# 从一个高分辨率大尺寸的图像向上构建一个金字塔(尺寸变小,分辨率降低) 对图像进行滤波然后进行下采样
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY)
# 先转换成灰度,然后进行二值化
contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #检测轮廓
for c in contours: # c为图像轮廓findContours返回值
# 计算出简单的边界框(外接的矩形,把找到的形状包起来,先要确定四个点) 将轮廓信息转换成为(x,y)左上点坐标,并加上矩形高度和宽度
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) # (B,G,R)绿色绘制边界框, (x+w, y+h)是右下点坐标, 宽度为2
rect = cv2.minAreaRect(c) # 获得最小外接矩形区域,返回Box2D结构rect(中心(x,y), (宽,高), 旋转角度)
box = cv2.boxPoints(rect) # 获取最小外接矩形的4个顶点坐标(ps: cv2.boxPoints(rect) for OpenCV 3.x)
box = np.int0(box) # 将坐标规范化为整数
cv2.drawContours(img, [box], 0, (0, 0, 255), 3) #红色绘制最小矩形区域
(x,y), radius = cv2.minEnclosingCircle(c) #函数获得最小闭圆, 返回圆心和半径
center = (int(x), int(y))
radius = int(radius) # 转换成整数
img = cv2.circle(img, center, radius, (0,255,0),2) #绘制最小闭圆
cv2.drawContours(img, contours, -1, (255, 0, 0), 1) #蓝色绘制边框
cv2.imshow("contours", img)
cv2.waitKey()
cv2.destroyAllWindows()