目录
一、图像旋转
1.numpy方法
2.opencv方法
二、模版匹配多项
1.完整代码
2.步骤解析
3.结果
三、图像旋转+模版匹配
一、图像旋转
- 图像旋转有两种方式
1.numpy方法
import cv2
import numpy as np
img = cv2.imread('suda.jpg')
img = cv2.resize(img, (300, 300))
# np方法
rotated_image1 = np.rot90(img, k=-1) # 旋转 90 度,k=-1 表示顺时针旋转 90 度
rotated_image1 = np.rot90(rotated_image1, k=-1) # 两次旋转90度 即180度
rotated_image2 = np.rot90(img, k=1) # 旋转 90 度,k=1 表示逆时针旋转 90 度
cv2.imshow('yuantu', img)
cv2.imshow('rotated_imagel', rotated_image1)
cv2.imshow('rotated_image2', rotated_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
- 左边是原图,中间是旋转180的图像,右边是逆时针旋转90度的图像
2.opencv方法
import cv2
import numpy as np
img = cv2.imread('suda.jpg')
img = cv2.resize(img, (300, 300))
# opencv方法
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)
输出:
- 左边是顺时针90度的图像,中间是逆时针90度的图像,右边是180度的图像
二、模版匹配多项
1.完整代码
import cv2
import numpy as np
img_rgb = cv2.imread('pic.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
moban = cv2.imread('moban.jpg', 0)
h, w = moban.shape[:2]
# 使用模板匹配方法 cv2.matchTemplate 进行模板匹配
res = cv2.matchTemplate(img_gray, moban, cv2.TM_CCOEFF_NORMED) # TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。
# 设定匹配阈值
threshold = 0.95
# 获取匹配结果中所有符合闽值的点的坐标
loc = np.where(res >= threshold) # ([y],[x])
# 遍历所有匹配点
for pt in zip(*loc[::-1]): # pt为(x,y)
# 在原图上绘制匹配区域的矩形
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)
cv2.imshow('res.png', img_rgb)
cv2.waitKey(0)
2.步骤解析
- 模版匹配跟之前步骤一样,
- 使用cv2.matchTemplate()方法进行模版匹配
- 返回每一个像素点的匹配度的矩阵
- 模版匹配多项里加了一个阈值
- 取出矩阵中匹配度大于阈值的像素点
- 然后绘制出符合条件的每一个像素点的矩形区域
- 最后叠加出来的图像就是模版匹配多项的结果
3.结果
- 一次匹配了图像中的两个部分
三、图像旋转+模版匹配
- 这里将模版匹配多项写进了pp函数里,方便重复使用
- 然后只需将图像旋转几次即可
- 选用上面两种方法的哪种都可以
import cv2
import numpy as np
img_rgb = cv2.imread('pic.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
def pp(moban):
# moban = cv2.imread('m.png', 0)
h, w = moban.shape[:2]
# 使用模板匹配方法 cv2.matchTemplate 进行模板匹配
res = cv2.matchTemplate(img_gray, moban, cv2.TM_CCOEFF_NORMED) # TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。
# 设定匹配阈值
threshold = 0.9
# 获取匹配结果中所有符合闽值的点的坐标
loc = np.where(res >= threshold) # 二元组 ([y],[x])
# 遍历所有匹配点
for pt in zip(*loc[::-1]): # 将loc逆序,将元组解包为两个列表,再zip配对 pt为(x,y)
# 在原图上绘制匹配区域的矩形柜
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)
cv2.imshow('res.png', img_rgb)
cv2.waitKey(0)
moban = cv2.imread('moban.jpg', 0)
moban1 = cv2.rotate(moban, cv2.ROTATE_90_CLOCKWISE) # 顺时针旋转90度
moban2 = cv2.rotate(moban, cv2.ROTATE_90_COUNTERCLOCKWISE) # 逆时针旋转90度
# moban3 = cv2.rotate(moban, cv2.ROTATE_180) # 旋转180度
pp(moban)
pp(moban1)
pp(moban2)
# pp(moban3)
输出:
- 各个方向的箭头都匹配到了