代码改变世界

计算机视觉--opencv---如何识别不同方向图片的识别(一) - 指南

2025-11-11 08:13  tlnshuju  阅读(5)  评论(0)    收藏  举报

目录

OpenCV多模板匹配与多角度图像识别实战

一、使用 OpenCV 实现多模板匹配

核心步骤与原理

示例代码

二、OpenCV 图像旋转:固定角度的高效实现

固定角度旋转的技术优势

cv2.rotate()函数深度解析

函数原型与参数

旋转模式的底层原理

示例代码(两种实现方式)

三、多角度图像识别:在大图中找不同角度的小模板

需求背景

实现步骤

1. 读取基础图像

2. 生成旋转模板集合

3. 定义通用匹配函数

4. 批量匹配与结果展示

完整代码

最终效果


OpenCV多模板匹配与多角度图像识别实战

数据准备:

jt.jpg

jiant.jpg

一、使用 OpenCV 实现多模板匹配

核心步骤与原理

  1. ​读取图像与模板​​:加载待检测的原始彩色图像和灰度模板图像

  2. ​选择匹配方法​​:OpenCV 提供了多种匹配算法(如 TM_CCOEFF、TM_CCOEFF_NORMED 等)TM_CCOEFF(相关系数)、TM_CCOEFF_NORMED(归一化相关系数,最常用)

  3. ​执行模板匹配​​:通过cv2.matchTemplate()计算模板在原始图像中的匹配度矩阵

  4. ​阈值筛选结果​​:设定阈值(如0.9)过滤低匹配度的区域

  5. ​重叠区域处理​​:保留匹配度最高的区域,避免重复标记

示例代码

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)

(x',y')=(y, w-1-x)

180°

两次水平翻转/反转像素顺序

(w,h)→(w,h)

(x',y')=(w-1-x, h-1-y)

逆时针90°

转置+垂直翻转

(w,h)→(h,w)

(x',y')=(h-1-y, x)

示例代码(两种实现方式)

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()预处理模板