笔记:
一、导入图片名字不能为中文,会导致报错
二、threshold函数
retval代表返回值的阈值、
dst代表阈值分割结果图像
img代表要阈值处理的图像、
127代表要设定的阈值,
55代表当最后一个参数为THRESH_BINARY或者THRESH_BINARY_INV类型时需设定的最大值
代表阈值的分割类型
三、查找图像轮廓:findContours()函数
1、image与函数参数中的原图像一致 (opencv4~取消第一个参数)
2、coutours返回的轮廓
3、hierarchy图像的拓扑信息(轮廓层次)处理后
A、image:原始图像(灰度图像自动转换为二值化图像)
B、mode:轮廓检索模式(所用到的是检测外孔和内孔轮廓)
C、method:轮廓的近似方法(所用到的是储存所有轮廓点)
四、绘制轮廓: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 ]坐标表示
全部代码:
# 设定编码模式为:·utf-8
# -*- coding: utf-8 -*-
# 导入cv2模块并且命名为cv
import cv2 as cv
# 导入图片(!!!图片名不能为中文,不然会导致报错!!!)
o = cv.imread('triangle.jpg') # 0的解释:将图像调整为单通道的灰色图像
cv.namedWindow('discerns', 0) # 创建窗口:'discern'为创建窗口的名字;0是为下一步设置窗口尺寸设置的
cv.resizeWindow('discerns', 500, 500) # 设置窗口尺寸,单位为Px(像素):'discern'为要设置尺寸的窗口
cv.moveWindow("discerns", 400, 200) # 设置窗口位置
cv.imshow("discerns", o) # 显示图像:"discern":图像所要显示在的窗口名字;第二个参数:要显示的内容
img2 = cv.cvtColor(o, cv.COLOR_BGR2GRAY) # 色彩空间转换:第一个参数为要转换的对象,第二个参数为转换类型
retval, binary = cv.threshold(img2, 127, 55, cv.THRESH_BINARY) # 二值化阈值处理
"""threshold
retval代表返回值的阈值、
dst代表阈值分割结果图像
img代表要阈值处理的图像、
127代表要设定的阈值,
55代表当最后一个参数为THRESH_BINARY或者THRESH_BINARY_INV类型时需设定的最大值
代表阈值的分割类型
"""
# 查找图像轮廓:findContours()函数
"""查找图像轮廓:findContours()函数
1、image与函数参数中的原图像一致 (opencv4~取消第一个参数)
2、coutours返回的轮廓
3、hierarchy图像的拓扑信息(轮廓层次)处理后
A、image:原始图像(灰度图像自动转换为二值化图像)
B、mode:轮廓检索模式(所用到的是检测外孔和内孔轮廓)
C、method:轮廓的近似方法(所用到的是储存所有轮廓点)
"""
coutours, hierarchy = cv.findContours(binary, cv.RETR_CCOMP, cv.CHAIN_APPROX_NONE)
# 打印轮廓信息
print(coutours)
# 绘制轮廓: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 ]坐标表示
"""
o = cv.drawContours(
image=o,
contours=coutours,
contourIdx=-1,
color=(0, 255, 0),
thickness=3,
lineType=cv.LINE_8,
# hierarchy=cv.findContours(),
maxLevel=5,
offset=[0, 0]
)
# 创建窗口:'discern'为创建窗口的名字;0是为下一步设置窗口尺寸设置的
cv.namedWindow('discern', 0)
# 设置窗口尺寸,单位为Px(像素):'discern'为要设置尺寸的窗口
cv.resizeWindow('discern', 500, 500)
# 设置窗口位置
cv.moveWindow("discern", 900, 200)
# 显示图像:"discern":图像所要显示在的窗口名字;第二个参数:要显示的内容
cv.imshow("discern", o)
# 将键盘输入的按键的ASCII值传给变量(如果括号内传参为0,窗口会一直显示,直到有按键输入
# (ASCII值)停止显示,!!!该函数参数的默认值为”0“)
key = cv.waitKey()
# 判断:如果键盘输入"A"释放窗口
if key == ord("A"):
cv.destroyAllWindows() # 释放窗口、可以传参:所要释放窗口的名字
运行效果: