Python OpenCV 上手-2

高级货来咯~

旋转图像

虽然这是一个常见的操作,但是在cv2中实行起来就比较麻烦。 应为转不好的话,图片会被剪裁。

正确的旋转姿势

这个方法只能用于横向的图片

1
2
3
4
5
6
7
8
9
10
11
def rotate(img, angle):
rows, cols = img.shape # 获取图片尺寸

# 把图片补成正方形
pad = np.zeros((int(cols - rows), cols), dtype=np.uint8) # 一块黑色的图片
img = np.concatenate((img, pad), 0) # 拼接在图片下方

x = y = int(rows / 2) # 计算旋转中心
M = cv2.getRotationMatrix2D((x, y), angle, 1) # 生成计算矩阵
dst = cv2.warpAffine(img, M, (rows, cols)) # 应用效果
return dst

旋转前▼

旋转后▼

搜索图像

matchTemplate()在大图中寻找小图片段。
要求图片的方向一致,且小图的长宽都不嫩大于大图的。

寻找小图在大图中的位置

先上代码▼

1
res = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED)

意思就是从原图screen图片中用CV_TM_CCOEFF相关系数匹配法去计算与快图template图的相似度。结果用1表示完美的匹配,-1表示最差的匹配.
为了确定匹配区域, 我们不得不滑动模板图像和原图像进行。
滑动的意思是图像块一次移动一个像素 (从左往右,从上往下). 在每一个位置, 都进行一次度量计算来表明它与那个位置匹配是 “好” 或 “坏”。(或者说块图像和原图像的特定区域有多么相似)。
返回的result中会包含左上角坐标点以及匹配度。
比如我有这么一张图,然后想把选定的答案截取出来▼

如果我们能找出选定的位置,那么就能截取出选定的答案了。人工截取了选定作为template

具体代码▼

1
2
3
4
5
6
res = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED)

loc = np.where(res >= res.max()) # 获取相似度最高的坐标
pos_h, pos_w = list(zip(*loc))[0]

cv2.rectangle(screen, (pos_h, 0), (pos_h +30, pos_w ), (7, 7, 151), 3) # 标记answer

计算相似度

我们也可以仅仅取出result中相似度最大的值来表示块图像和原图像的相似度,以此来判断多个图像中,那个才是我们要的图像。
比如我们知道了答案的截图是▼

然后有几个选项的截图是▼

那我们就可以用答案去匹配结果,那么匹配度最高的,就是我们的答案了。
这样就可以避免再开一个OCR的坑了。哈哈哈

-------------本文结束,感谢您的阅读。如有疑问请及时提出-------------