旋转图像
虽然这是一个常见的操作,但是在cv2中实行起来就比较麻烦。 应为转不好的话,图片会被剪裁。
正确的旋转姿势
这个方法只能用于横向的图片
1 | def rotate(img, angle): |
旋转前▼
旋转后▼
搜索图像
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
6res = 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的坑了。哈哈哈