计算机视觉--opencv---如何识别不同方向图片的识别(一)
目录
OpenCV多模板匹配与多角度图像识别实战
一、使用 OpenCV 实现多模板匹配
核心步骤与原理
示例代码
二、OpenCV 图像旋转:固定角度的高效实现
固定角度旋转的技术优势
cv2.rotate()函数深度解析
函数原型与参数
旋转模式的底层原理
示例代码(两种实现方式)
三、多角度图像识别:在大图中找不同角度的小模板
需求背景
实现步骤
1. 读取基础图像
2. 生成旋转模板集合
3. 定义通用匹配函数
4. 批量匹配与结果展示
完整代码
最终效果
OpenCV多模板匹配与多角度图像识别实战
数据准备:
jt.jpg
jiant.jpg
一、使用 OpenCV 实现多模板匹配
核心步骤与原理
-
读取图像与模板:加载待检测的原始彩色图像和灰度模板图像
-
选择匹配方法:OpenCV 提供了多种匹配算法(如 TM_CCOEFF、TM_CCOEFF_NORMED 等)
TM_CCOEFF
(相关系数)、TM_CCOEFF_NORMED
(归一化相关系数,最常用) -
执行模板匹配:通过
cv2.matchTemplate()
计算模板在原始图像中的匹配度矩阵 -
阈值筛选结果:设定阈值(如0.9)过滤低匹配度的区域
-
重叠区域处理:保留匹配度最高的区域,避免重复标记
示例代码
import cv2
import numpy as np# 1. 读取图像(原始图转灰度,模板直接读灰度)
img_rgb = cv2.imread('jiant.jpg') # 原始彩色图(用于最终显示)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) # 灰度图(用于匹配)
template = cv2.imread('jt.jpg', 0) # 模板(灰度模式)
h, w = template.shape[:2] # 模板尺寸# 2. 执行模板匹配(归一化相关系数法)
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)# 3. 设定阈值筛选匹配区域
threshold = 0.9
loc = np.where(res >= threshold) # 获取匹配度≥阈值的坐标(y,x格式)# 4. 绘制匹配框
for pt in zip(*loc[::-1]): # 转换为(x,y)格式cv2.rectangle(img_rgb, pt, (pt[0]+w, pt[1]+h), (0,0,255), 1) # 红色框,线宽1# 5. 显示结果
cv2.imshow('Multi-Template Matching', img_rgb)
cv2.waitKey(0)
代码效果展示:
二、OpenCV 图像旋转:固定角度的高效实现
固定角度旋转的技术优势
相比任意角度旋转,固定角度(90°/180°/270°)旋转具备:
-
像素位置可预测:无需插值,旋转后坐标为整数
-
画布尺寸确定:90°/270°旋转时宽高互换,180°旋转尺寸不变
-
计算效率极高:基于矩阵转置+翻转,比任意角度快10倍以上
-
无信息丢失:完整保留原始像素,不裁剪内容
cv2.rotate()
函数深度解析
函数原型与参数
rotated_img = cv2.rotate(src, rotateCode)
-
src
:输入图像(ndarray格式,支持单/三/四通道) -
rotateCode
:旋转模式(仅支持3种预定义值):-
cv2.ROTATE_90_CLOCKWISE
:顺时针转90° -
cv2.ROTATE_180
:旋转180° -
cv2.ROTATE_90_COUNTERCLOCKWISE
:逆时针转90°(等价于顺时针270°)
-
-
返回值:旋转后的图像(与输入同数据类型、通道数)
旋转模式的底层原理
旋转方向 | 实现步骤 | 尺寸变化 | 坐标映射公式 |
---|---|---|---|
顺时针90° | 转置+水平翻转 | (w,h)→(h,w) |
|
180° | 两次水平翻转/反转像素顺序 | (w,h)→(w,h) |
|
逆时针90° | 转置+垂直翻转 | (w,h)→(h,w) |
|
示例代码(两种实现方式)
import cv2
import numpy as np# 读取原始图
img = cv2.imread('./jt.jpg')# 方式1:使用np.rot90(更灵活)
rotated1 = np.rot90(img, k=-1) # 顺时针90°(k=-1)
rotated2 = np.rot90(img, k=1) # 逆时针90°(k=1)# 方式2:使用cv2.rotate(更高效)
rotated_cv1 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 顺时针90°
rotated_cv2 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) # 逆时针90°
rotated_cv3 = cv2.rotate(img, cv2.ROTATE_180) # 180°旋转# 显示结果(方式1)
cv2.imshow('Original', img)
cv2.imshow('Rotated 90° (np)', rotated1)
cv2.imshow('Rotated -90° (np)', rotated2)
cv2.waitKey(0)
cv2.destroyAllWindows()# 显示结果(方式2)
cv2.imshow('Rotated 90° (cv2)', rotated_cv1)
cv2.imshow('Rotated -90° (cv2)', rotated_cv2)
cv2.imshow('Rotated 180° (cv2)', rotated_cv3)
cv2.waitKey(0)
三、多角度图像识别:在大图中找不同角度的小模板
需求背景
原始模板仅能匹配一个角度,需生成旋转后的模板集合,逐一匹配以覆盖多角度目标。
实现步骤
1. 读取基础图像
img_rgb = cv2.imread('jiant.jpg') # 原始彩色图(最终显示用)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) # 匹配用灰度图
template = cv2.imread('jt.jpg', 0) # 原始模板(灰度)
2. 生成旋转模板集合
# 逆时针旋转90°的模板
image_ccw90 = np.rot90(template, k=-1)
# 顺时针旋转90°的模板
image_cw90 = np.rot90(template, k=1)
3. 定义通用匹配函数
def match_template(target_template, source_img, threshold=0.9):"""执行模板匹配并标记结果:param target_template: 待匹配的模板(灰度):param source_img: 原始彩色图(用于绘制框):param threshold: 匹配阈值"""# 获取模板尺寸h, w = target_template.shape[:2]# 执行匹配res = cv2.matchTemplate(img_gray, target_template, cv2.TM_CCOEFF_NORMED)# 筛选匹配位置loc = np.where(res >= threshold)# 绘制矩形框for pt in zip(*loc[::-1]):cv2.rectangle(source_img, pt, (pt[0]+w, pt[1]+h), (0,0,255), 1)
4. 批量匹配与结果展示
# 1. 用原始模板匹配
match_template(template, img_rgb)
# 2. 用逆时针90°模板匹配
match_template(image_ccw90, img_rgb)
# 3. 用顺时针90°模板匹配
match_template(image_cw90, img_rgb)# 显示最终结果(覆盖所有角度的匹配框)
cv2.imshow('Multi-Angle Template Matching', img_rgb)
cv2.waitKey(0)
完整代码
import cv2
import numpy as np# 1. 读取基础图像
img_rgb = cv2.imread('jiant.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('jt.jpg', 0)# 2. 生成旋转模板
image_ccw90 = np.rot90(template, k=-1) # 逆时针90°
image_cw90 = np.rot90(template, k=1) # 顺时针90°# 3. 定义匹配函数
def match_template(target_template, source_img, threshold=0.9):h, w = target_template.shape[:2]res = cv2.matchTemplate(img_gray, target_template, cv2.TM_CCOEFF_NORMED)loc = np.where(res >= threshold)for pt in zip(*loc[::-1]):cv2.rectangle(source_img, pt, (pt[0]+w, pt[1]+h), (0,0,255), 1)# 4. 执行多模板匹配
match_template(template, img_rgb)
match_template(image_ccw90, img_rgb)
match_template(image_cw90, img_rgb)# 5. 显示结果
cv2.imshow('Multi-Angle Matching Result', img_rgb)
cv2.waitKey(0)
最终效果
(原始图中被红色框标记的多角度目标)
说明:
-
可根据需求扩展旋转角度(如45°需结合仿射变换,但固定角度已覆盖大部分场景)
-
阈值
threshold
需根据实际图像调整(范围0~1,越接近1匹配越严格) -
若模板有缩放,需结合
cv2.resize()
预处理模板