重点:
一、查找图像轮廓:findContours()函数
coutours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
1、image与函数参数中的原图像一致 (opencv4~取消第一个参数)
2、coutours返回的轮廓
3、hierarchy图像的拓扑信息(轮廓层次)处理后
A、image:原始图像(灰度图像自动转换为二值化图像)
B、mode:轮廓检索模式(所用到的是检测外孔和内孔轮廓)
C、method:轮廓的近似方法(所用到的是储存所有轮廓点)
二、cv.THRESH_BINARY_INV(反二值化阈值)
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV) # 反二值化阈值
三、计算轮廓数量
coutours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
n = len(coutours)
四、反二值化阈值参考资料
全部代码:
# 导入模块
import cv2 as cv
import numpy as np
# 读取图片(图片路径不能有中文字符)
img1 = cv.imread("experiment/buguize.jpg")
# 创建窗口:'discern'为创建窗口的名字;0是为下一步设置窗口尺寸设置的
cv.namedWindow("img1", 0)
# 设置窗口尺寸,单位为Px(像素):"img1"为要设置尺寸的窗口
cv.resizeWindow("img1", 500, 500)
# 设置窗口位置:img1(要设置位置的窗口名字),第二和第三个参数为要设置窗口的大小(x,y)
cv.moveWindow("img1", 380, 200)
# 显示窗口:"img1"(内容所显示在的窗口),第二个参数(要显示的内容)
cv.imshow("img1", img1)
gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY) # 色彩转换
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV) # 反二值化阈值
# 查找轮廓
coutours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
n = len(coutours) # 轮廓数量
coutoursImg = [] # 创建绘制轮廓列表
for i in range(n):
temp = np.zeros(img1.shape, np.uint8) # 把图像转换为矩阵
coutoursImg.append(temp) # 向列表追加矩阵信息
# 绘制轮廓:drawContours()
"""绘制轮廓:drawContours()
1、img2:等待绘制轮廓的图像
2、coutours:要绘制的轮廓(与findContours()函数输出的coutours参数一致《list类型即:列表类型》)
3、contourIdx:要绘制一条轮廓还是全部轮廓:如果参数是一个整数或者0表示绘制对应索引号的轮廓[如果是-1表示绘制全部轮廓]
4、color:绘制颜色,用B,G,R格式表示
5、thickness:表示绘制时的画笔粗细,如果为-1表示用实心绘制
6、lineType:表示绘制线轮廓时的线形
7、hierarchy:所输出的层次信息
8、maxLevel:控制轮廓层次的深度(如果是0表示绘制地0层轮廓)
9、offset:偏移参数使轮廓偏移一定位置用[ x , y ]坐标表示
"""
# coutoursImg[i] = cv.drawContours(coutoursImg[i], coutours, i, (255, 255, 255), 3
coutoursImg[i] = cv.drawContours(img1, coutours, i, (0, 255, 0), 3
)
if cv.contourArea(coutours[i]) > 1500:
print("第" + str(i + 1) + "个图形的面积是:" + str(cv.contourArea(coutours[i])) + "个像素点")
# cv.imshow("coutours[" + str(i) + "]", coutoursImg[i])
# 创建窗口:'discern'为创建窗口的名字;0是为下一步设置窗口尺寸设置的
cv.namedWindow('chulihou', 0)
# 设置窗口尺寸,单位为Px(像素):'discern'为要设置尺寸的窗口
cv.resizeWindow('chulihou', 500, 500)
# 设置窗口位置
cv.moveWindow("chulihou", 900, 200)
cv.imshow("chulihou", img1)
# 键盘输入检测,参数为显示时长,如果参数为0就是键盘按下退出显示
cv.waitKey()
# 关闭所有窗口
cv.destroyAllWindows()
运行效果: