15.图像 模板轮廓检测
模板匹配时,模板需要比原图小,或者缩小原图(缩小原图下次讲)
模板匹配算法 OpenCV模板匹配算法详解 - weiwei22844 - 博客园
import cv2
from matplotlib import pyplot as plt#导入 Matplotlib 库中的 pyplot 模块,并命名为 plt。#Matplotlib 是一个强大的绘图库,常用于绘制图表和图像显示。#就是窗口# OpenCV BGR(Blue, Green, Red)# Matplotlib RGB(Red, Green, Blue)
import numpy as np #导入 NumPy 库,并命名为 np。#NumPy 提供了多维数组对象及各种派生对象(如掩模数组),并且包含大量用于数组快速操作的函数。# 如果图像不在脚本所在目录,请提供完整路径
img1_t = cv2.imread(r"D:/Professional software package(new)/VS Projects/OPenCv/Picture/IMG_20231230_171718.jpg")#使用 OpenCV 函数读取图像文件。
img2_t= cv2.imread(r"D:/Professional software package(new)/VS Projects/OPenCv/Picture/202310281019103.jpg") #它返回的是一个 NumPy 数组,其中包含了图像的像素数据。如果没有找到图像或路径错误,img 将是 None。
img3_t= cv2.imread(r"D:/Professional software package(new)/VS Projects/OPenCv/Picture/maoci1.jpg") #它返回的是一个 NumPy 数组,其中包含了图像的像素数据。如果没有找到图像或路径错误,img 将是 None。# 检查图片是否成功加载
if img1_t is None:print("Error: 图像1加载失败,请检查文件路径和文件权限。")
elif img2_t is None: print("Error: 图像2加载失败,请检查文件路径和文件权限。")
elif img3_t is None: print("Error: 图像3加载失败,请检查文件路径和文件权限。")
else:# 将 BGR 图像转换为 RGB 图像以供 matplotlib 正确显示print(" 图像加载成功!")img1_rgb = cv2.cvtColor(img1_t, cv2.COLOR_BGR2RGB)#由于 OpenCV 默认使用 BGR 格式来存储图像数据,而大多数其他图像处理工具(包括 Matplotlib)使用 RGB 格式。 #因此,在用 Matplotlib 显示图像之前,我们需要将图像从 BGR 格式转换为 RGB 格式。img3_rgb = cv2.cvtColor(img3_t, cv2.COLOR_BGR2RGB)img2_rgb = cv2.cvtColor(img2_t, cv2.COLOR_BGR2RGB) #RGB 和 BGR 只是颜色通道的不同排序#添加函数 图片展示函数
def CV_Show(name,img,time,percent): scale_percent = percent # 百分比width = int(img.shape[1] * scale_percent / 100) #shape[1]:图片的宽度height = int(img.shape[0] * scale_percent / 100) #shape[0]:图片的高度dim = (width, height)#格式为 (width, height)resized_img = cv2.resize(img, dim,interpolation=cv2.INTER_AREA)cv2.imshow(name, resized_img)cv2.waitKey(time*1000)#显示多少秒 cv2.destroyAllWindows()#***************预处理************
img2_gray=cv2.cvtColor(img2_rgb,cv2.COLOR_BGR2GRAY)#转化为灰白图
img2_gray_ret,img2_gray_dst=cv2.threshold(img2_gray,150,255,cv2.THRESH_BINARY)#返回参数分别为 返回阈值,返回图片
#CV_Show("img2_img2_gray_dstgray",img2_gray_dst,3,50)
#********************************contours,hierarchy=cv2.findContours(img2_gray_dst,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#取轮廓必须为灰白图
# contours: 找到的所有轮廓,每个轮廓是一个包含 x,y 坐标的数组。
# hierarchy: 每个轮廓对应的层次信息。这是一个数组,每个元素有 4 个整数,分别表示:
# 下一个同级轮廓的索引
# 上一个同级轮廓的索引
# 第一个子轮廓的索引
# 包含当前轮廓的第一个父轮廓的索引# 第2个输入值:mode: 轮廓检索模式
# 常用选项:
# cv2.RETR_EXTERNAL: 只检索最外层的轮廓。
# cv2.RETR_LIST: 检索所有轮廓但不创建任何层次关系。
# cv2.RETR_CCOMP: 检索所有轮廓并将它们组织成两级层次结构,即外部轮廓和孔洞。
# cv2.RETR_TREE: 检索所有轮廓并重建完整的层级结构。(常用)# 第1个输入值method: 轮廓近似方法
# 常用选项:
# cv2.CHAIN_APPROX_NONE: 存储所有的轮廓点。这意味着每个点都会被存储下来,这可能会占用较多内存。
# cv2.CHAIN_APPROX_SIMPLE: 压缩水平、垂直和对角方向的点,只保留端点。例如,一个矩形轮廓只需要存储四个顶点。
# 其他选项还包括 cv2.CHAIN_APPROX_TC89_L1, cv2.CHAIN_APPROX_TC89_KCOS 等,这些是基于Teh-Chin链逼近算法的方法。#绘制图片
#传入绘制图片,轮廓,轮廓索引,颜色模式,线条厚度
#注意输入图片的copy,不然原图会变
draw_img=img2_gray_dst.copy()
res=cv2.drawContours(draw_img,contours,-1,(0,0,255),2)#可以传入彩色图,但轮廓参数必须为黑白
#图取得
CV_Show("res",res,3,50)
# 在图像 draw_img 上绘制轮廓。
# 参数详解:
# 参数 含义
# draw_img 要绘制轮廓的原始图像(通常是彩色图像,3通道)
# contours 由 cv2.findContours() 找到的轮廓列表
# -1 表示绘制所有轮廓(若为 0 则只绘制第一个轮廓)
# (0, 0, 255) 颜色,表示红色(BGR 格式)
# 2 线宽,轮廓线的粗细(单位:像素)
# 返回值:
# res:绘制了轮廓的新图像。