2021-07-15

边界框、最小矩形区域和最小闭圆的轮廓,详细注释

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()
上一篇:链队列的c语言实现


下一篇:java-使用ObjectOutputStream时估计磁盘上文件的大小