Opencv——图片旋转及多模板匹配

一、图片旋转

方法一

python 复制代码
import numpy as np


np.rot90(image, k)

参数介绍:

image:

需要旋转的图片

k:旋转的次数(每次旋转 90 度)

正数:逆时针旋转(k=1→90°,k=2→180°)

负数:顺时针旋转(k=-1→90°,k=-2→180°)

注意:图片旋转 90 度后,宽高会互换

示例:

待旋转图片:

python 复制代码
import cv2
import numpy as np

#方法1
img = cv2.imread('../data/kele.png')
#旋转90度,k = -1,表示顺时针旋转90 度
rotated_image1 = np.rot90(img,k=-1)
#旋转90 度,k=1表示逆时针旋转90 度
rotated_image2 = np.rot90(img, k=1)
cv2.imshow(  'yuantu',img)
cv2.imshow( 'rotated_imagel',rotated_image1)
cv2.imshow( 'rotated_image2',rotated_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

方法二

python 复制代码
import cv2

cv2.rotate(src, rotateCode)

参数介绍:

src:

待旋转的原始图像(灰度图 / 彩色图均可)

rotateCode:指定旋转角度和方向(仅 3 个可选值)

cv2.ROTATE_90_CLOCKWISE:顺时针旋转 90°

cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转 90°

cv2.ROTATE_180:旋转 180°

示例:

待旋转图片:

python 复制代码
import cv2
import numpy as np


img = cv2.imread('../data/kele.png')

#方法二
rotated_image = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)#顺时针90度
rotated_image1 = cv2.rotate (img, cv2.ROTATE_90_COUNTERCLOCKWISE)#逆时针90度
rotated_image2 = cv2.rotate(img, cv2.ROTATE_180)#旋转180度

cv2.imshow( 'shun90',rotated_image)
cv2.imshow('ni90',rotated_image1)
cv2.imshow('180',rotated_image2)

cv2.waitKey(0)
cv2.destroyAllWindows()

二、多模板匹配

如图所示,将指针经过旋转等操作使得与上图匹配

思路步骤:

1、准备目标图像 和基础模板

2、预处理 ------ 统一图像格式(转灰度图,降噪,尺寸一致等)

3、创建不同形态的模板变体(本例为旋转)

4、逐模板匹配 ------ 计算匹配得分

5、设定阈值

6、可视化 ------ 绘制匹配框并验证结果

python 复制代码
import cv2
import numpy as np

img_rgb = cv2.imread('../data/image_zhizhen.jpg')
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)

template = cv2.imread('../data/zhizhen.jpg',0)
template_shun_90 = np.rot90(template,k=-1)
template_ni_90 = np.rot90(template,1)

h,w = template.shape[:2]
# 使用模板匹配方法 cv2.matchTemplate 进行模板匹配
res_1 = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
res_2 = cv2.matchTemplate(img_gray,template_shun_90,cv2.TM_CCOEFF_NORMED)
res_3 = cv2.matchTemplate(img_gray,template_ni_90,cv2.TM_CCOEFF_NORMED)
# 设定匹配阈值
threshold = 0.9
# 获取匹配结果中所有符合阈值的点的坐标
loc1 = np.where((res_1 > threshold))
loc2 = np.where((res_2 > threshold))
loc3 = np.where((res_3 > threshold))

print(loc1)
print(loc2)
print(loc3)

# 遍历所有匹配点
for pt in zip(*loc1[::-1]):
    cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)
for pt in zip(*loc2[::-1]):
    cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)
for pt in zip(*loc3[::-1]):
    cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)

cv2.imshow('last',img_rgb)
cv2.waitKey(0)

下图代码中loc1::-1是将找到的匹配轮廓索引(行,列)(行对应图片的垂直方向(上下) → 程序里叫 y坐标(纵向位置),列对应图片的水平方向(左右) → 程序里叫 x坐标(横向位置))倒转为cv2.rectangle()需要的格式(列,行)

python 复制代码
for pt in zip(*loc1[::-1]):
    cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)
for pt in zip(*loc2[::-1]):
    cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)
for pt in zip(*loc3[::-1]):
    cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)
相关推荐
workflower几秒前
汽车自动驾驶9 要素
人工智能·机器学习·重构·云计算·汽车·无人机
hhb_6185 分钟前
大模型工具链选型实战方案
人工智能
2601_950760799 分钟前
GDF-15重组蛋白:从孕期免疫耐受到多发性硬化神经保护的关键调控因子
人工智能·蛋白
一切皆是因缘际会14 分钟前
穿透多维场景
人工智能
七牛云行业应用20 分钟前
Dots 完整教程:从安装入口、跑第一个任务到给 Codex 派活(2026 年 10 月)
人工智能·大模型·agent
镜象科技3 小时前
AI情感大模型应用场景全解:从校园到医院再到企业的落地地图
人工智能
Joshua-a4 小时前
工程数学-理解卷积的含义_线性时不变系统的冲激响应与卷积
人工智能·深度学习
song5014 小时前
React Native for OpenHarmony 实战:三方库 react-native-css-transformer 的鸿蒙化适配指南
css·人工智能·深度学习·react native·transformer
老金带你玩AI9 小时前
ChatGPT dots,到底能替你操多少心?
人工智能
AliCloudROS10 小时前
计算巢 X DeepSeek Harness — 云端智能体工作台
人工智能·阿里云