OpenCV(cv2)学习笔记:从模板匹配入门到常用函数
1️⃣ 什么是 OpenCV (cv2)
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了图像处理、视频分析、机器视觉、特征识别等功能。
在 Python 中,使用 cv2 模块来调用 OpenCV 的各种函数。
特点:
- 强大:涵盖图像读取、编辑、特征检测、机器学习等。
- 跨平台:支持 Windows、Linux、macOS。
- 易用:与 NumPy 紧密结合,图像直接以 numpy.ndarray(数组/矩阵)形式存储。
2️⃣ 模板匹配案例
模板匹配是一种在大图中寻找小图的经典方法。
我们的目标是:给定一张模板图(template),在目标图像(image)中找到它出现的位置,并用绿色矩形标记出来。
完整代码(详细注释版)
import cv2 # 导入 OpenCV 库,用于图像处理和计算机视觉# 1. 读取原图像(待搜索的图像)
kele = cv2.imread('image.png') # 从文件读取图像,返回 NumPy 数组(BGR 格式)
cv2.imshow('kele', kele) # 显示原图
cv2.waitKey(0) # 等待用户按下任意键,按键后窗口才会响应# 2. 读取模板图像(要找的小图)
template = cv2.imread('template.png')
cv2.imshow('template', template)
cv2.waitKey(0)# 3. 获取模板的尺寸(高 h,宽 w)
h, w = template.shape[:2] # shape[0] 是高度,shape[1] 是宽度# 4. 进行模板匹配
# TM_CCOEFF_NORMED:归一化相关系数匹配法,匹配度越高值越接近 1
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)# 5. 获取匹配结果中的最大值、最小值及对应的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# min_val:最小匹配值
# max_val:最大匹配值
# min_loc:最小值的位置 (x, y)
# max_loc:最大值的位置 (x, y)# 6. 确定最佳匹配区域
top_left = max_loc # TM_CCOEFF_NORMED 是"值越大越相似",所以取 max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)# 7. 在原图上绘制绿色矩形框
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)
# 参数:
# - (0, 255, 0):绿色 (BGR)
# - 2:线条宽度# 8. 显示结果
cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)
运行效果:
程序会依次弹出三个窗口:
- 显示原图 kele
- 显示模板图 template
- 在原图中绘制绿色矩形框标记匹配区域
3️⃣ 核心函数讲解
图像读写与显示
函数 | 作用 | 常用参数 |
---|---|---|
cv2.imread(path, flags) | 读取图像 | flags: cv2.IMREAD_COLOR(默认彩色)、cv2.IMREAD_GRAYSCALE(灰度) |
cv2.imwrite(path, img) | 保存图像 | 文件路径 |
cv2.imshow(winname, img) | 显示图像窗口 | winname 为窗口名 |
cv2.waitKey(delay) | 等待键盘事件 | delay=0 表示无限等待,单位:毫秒 |
cv2.destroyAllWindows() | 关闭所有窗口 | 无 |
图像属性
img.shape # (height, width, channels)
img.size # 图像像素总数
img.dtype # 图像数据类型(如 uint8)
绘图函数
函数 | 作用 |
---|---|
cv2.line(img, pt1, pt2, color, thickness) | 画线 |
cv2.rectangle(img, pt1, pt2, color, thickness) | 画矩形 |
cv2.circle(img, center, radius, color, thickness) | 画圆 |
cv2.putText(img, text, org, font, scale, color, thickness) | 绘制文字 |
模板匹配
函数 | 作用 |
---|---|
cv2.matchTemplate(image, templ, method) | 计算模板在图像中每个位置的匹配度 |
cv2.minMaxLoc(src) | 返回最小值、最大值及其坐标 |
常用匹配方法:
cv2.TM_SQDIFF
:平方差匹配(越小越相似)cv2.TM_CCORR_NORMED
:归一化相关匹配(越大越相似)cv2.TM_CCOEFF_NORMED
:归一化相关系数匹配(越大越相似)
4️⃣ OpenCV 与 NumPy 的关系
OpenCV 中的图像对象是一个 NumPy 数组:
可以用数组切片直接操作像素:
pixel = img[100, 200] # 获取 (y=100, x=200) 像素 [B, G, R]
blue_channel = img[:, :, 0] # 获取蓝色通道
可以直接使用 NumPy 的数学运算,如平均值、标准差:
import numpy as np
mean_brightness = np.mean(img)
5️⃣ 经验总结
cv2.imshow()
只是提交图像数据,必须配合cv2.waitKey()
才能真正显示。- 读取彩色图像时,OpenCV 默认是 BGR 而不是 RGB。
- 模板匹配适合小目标、光照变化不大的场景;更复杂的情况建议使用特征匹配(如 SIFT、ORB)。