当前位置: 首页 > news >正文

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

目录

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

http://www.dtcms.com/a/486424.html

相关文章:

  • 互联网大厂Java求职面试全景实战解析(涵盖Spring Boot、微服务及云原生技术)
  • Linux使用Docker部署Node.js+Express+SQLite项目
  • 如何自己开网站济南做平台网站的
  • STM32H743-ARM例程21-DSP
  • Linux下编译CGAL
  • 十五、OpenCV中的图像浮雕技术
  • 网站建设的搜索栏怎么设置重庆市建设工程信息网官网施工许可证查询
  • Effectively Using Public Data in Privacy Preserving Machine Learning
  • 国产电脑操作系统与硬盘兼容性现状分析:挑战与前景评估
  • 从 DAG 到 Shuffle:掌握 Spark RDD 宽窄依赖的调优密码
  • 48 元四核 ARM 核心板!明远智睿 2351 进入嵌入式市场
  • 李宏毅机器学习笔记23
  • 为何打不开中国建设银行网站深圳品牌营销策划机构
  • 大连旅顺网站制作有哪些网站可以做笔译
  • 【遥感图像处理】遥感图像车辆检测与跟踪全流程实战:从数据到部署(含Python代码)
  • PPO论文阅读
  • C++学习:异常及其处理
  • 无人机组队编队与相对定位原理详解
  • 两学一做网站登录沈阳网站设计外包
  • 网投网站如何建设中国建筑协会官网证件查询
  • 负载均衡:运维高可用的核心技术
  • 计网3.8 以太网交换机
  • 太原中小企业网站制作天津住房和城乡建设部网站
  • 如何选择最佳服务器搭建游戏?探索物理与云服务器的优势
  • 10.5 傅里叶级数:用线性代数研究函数
  • 攻防世界-[简单] 简单的base编码
  • 深入理解C++输入缓冲区:掌握各种输入方法的本质
  • 【字典树 单调栈】P9218 「TAOI-1」Apollo|普及+
  • 设计一个个人网站手机app是用什么软件开发的
  • 盘锦做网站选哪家app网站开发后台处理