import cv2
import numpy as np
#1、 读入图像
# img = cv2.imread(r"D:\1.jpg", cv2.IMREAD_UNCHANGED)
# img = cv2.imread(r"9.bmp", cv2.IMREAD_UNCHANGED)
img = cv2.imread(r"12.jpg", cv2.IMREAD_UNCHANGED)
# cv2.imshow("contours", img)
# 2、二值化 ret:暂时就认为是设定的thresh阈值,thresh:二值化的图像
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), # 转换为灰度图像,
130, 255, # >130的=255 否则=0
cv2.THRESH_BINARY) # 黑白二值化
# 3、搜索轮廓: 返回:图像,轮廓,轮廓的层析结构 输入:图像(二值图像),轮廓检索方式,轮廓近似方法
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# cv2.RETR_EXTERNAL---只检测外轮廓 # cv2.RETR_LIST---检测的轮廓不建立等级关系
# cv2.RETR_CCOMP-建立两个等级轮廓,上一层为外边界,里层为内孔边界信息 # cv2.RETR_TREE----建立一个等级树结构的轮廓
# cv2.CHAIN_APPROX_NONE---存储所有边界点 # cv2.CHAIN_APPROX_SIMPLE---压缩垂直、水平、对角方向,只保留端点
# cv2.CHAIN_APPROX_TX89_L1---使用teh - Chini近似算法 # cv2.CHAIN_APPROX_TC89_KCOS---使用teh - Chini近似算法
def rect_contours(c,img):
# 绘制矩形
rect = cv2.minAreaRect(c) # 获得最小矩形轮廓 可能带旋转角度
box = cv2.boxPoints(rect) # 计算最小区域坐标
box = np.int0(box) # 坐标规范化为整数
cv2.drawContours(img, [box], 0, (0, 0, 255), 3) # 画出轮廓
def circle_contours(c,img):
# 绘制圆形
(x, y), radius = cv2.minEnclosingCircle(c) # 计算最小封闭圆形中心、半径
center = (int(x), int(y)) # 转换成整数
radius = int(radius)
img = cv2.circle(img, center, radius, (0, 255, 0), 2) #img上_画出圆形
for c in contours:#循环搜索轮廓
x, y, w, h = cv2.boundingRect(c) #获得一个图像的最小矩形边框
# 传入一个轮廓图像,返回 x y 是左上角的点, w和h是矩形边框的宽度和高度
# 画出矩形, img 原图, (x, y),左上角坐标, (x + w, y + h)右下角坐标, 颜色, 线宽
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) #在img上_绘制普通矩形
rect_contours(c,img) #在img上_绘制旋转矩形
circle_contours(c,img)#在img上_绘制圆形
# 画出轮廓
# 五个输入:原始图像,轮廓(列表,以数组形式存储,记录每条轮廓所有像素点坐标(x,y),轮廓索引(当设置为-1时,绘制所有轮廓),画笔颜色,画笔大小
cv2.drawContours(img, contours, -1, (255, 0, 0), 1)#在img上_绘制轮廓
cv2.imshow("contours", img)
cv2.waitKey()
cv2.destroyAllWindows()
python_cv_轮廓
最新推荐文章于 2023-06-03 11:44:57 发布