OpenCV 例程200篇 总目录-202205更新
轮廓是一系列相连的像素点组成的曲线,代表了物体的基本外形。轮廓常用于形状分析和物体的检测和识别。
边缘检测根据灰度的突变检测边界,但检测到的边缘通常还是零散的片段,并未构成整体。从背景中分离目标,就要将边缘像素连接构成轮廓。也就是说,轮廓是连续的,边缘不一定都连续。边缘主要是作为图像的特征使用,而轮廓主要用来分析物体的形态。
OpenCV 提供函数 cv2.drawContours() 绘制轮廓。绘制轮廓并不是绘图显示,而是修改图像添加轮廓线。
函数说明:
cv.drawContours(image, contours, contourIdx, color[, thickness=1, lineType=LINE_8, hierarchy=Mat(), maxLevel=INT_MAX, offset=Point()] ) → image
cv.findContours() 对黑色背景的二值图像操作,通常会先使用阈值分割或边缘检测得到二值图像。
参数说明:
注意事项:
# 12.2 绘制轮廓
img = cv2.imread("../images/pattern1.png", flags=1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY_INV)
plt.figure(figsize=(9, 6))
plt.subplot(131), plt.axis('off'), plt.title("Origin")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 寻找二值化图中的轮廓
binary, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # OpenCV3
# contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # OpenCV4~
# 绘制最内层轮廓, hierarchy[0][i][2]=-1 表示没有子轮廓,即为最内层轮廓
contourEx = img.copy() # OpenCV3.2 之前的早期版本,查找轮廓函数会修改原始图像
for i in range(len(contours)): # 绘制第 i 个轮廓
if hierarchy[0][i][2]==-1: # 最内层轮廓
x, y, w, h = cv2.boundingRect(contours[i]) # 外接矩形
text = "{}({},{})".format(i, x, y)
contourEx = cv2.drawContours(contourEx, contours, i, (205, 0, 0), thickness=-1) # 第 i 个轮廓,内部填充
contourEx = cv2.putText(contourEx, text, (x,y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255))
print("i=", i, ",contours[i]:", contours[i].shape, ",hierarchy[0][i] =", hierarchy[0][i], "text=", text)
# 绘制全部轮廓,contourIdx=-1 绘制全部轮廓
contourTree = img.copy()
contourTree = cv2.drawContours(contourTree, contours, -1, (0, 0, 255), 2)
plt.subplot(132), plt.axis('off'), plt.title("External contour")
plt.imshow(cv2.cvtColor(contourEx, cv2.COLOR_BGR2RGB))
plt.subplot(133), plt.axis('off'), plt.title("Tree contour")
plt.imshow(cv2.cvtColor(contourTree, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124997075)
Copyright 2022 youcans, XUPT
Crated:2022-5-25
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours)
【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓(cv.drawContours)
【youcans 的 OpenCV 例程200篇】196.图像的矩和不变矩(cv.moments)
【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征
【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测
【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框
【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】