一.实现目标
这次实战练习希望达到的目标是匹配扑克牌上的相同花色。本文采用模式匹配
的思路来进行匹配。实现效果如下图(大家可自行优化代码)
二.选定模板
首先选取ROI,也就是要匹配花色的区域,这里我是用一个简单代码来得到区域坐标的,代码如下:
import cv2
import numpy as np
drawing=False
ix,iy=-1,-1
img=cv2.imread('pukepai.jpg')
temp_img=img.copy()#用于临时绘制
def get_point(event,x,y,flags,param):
global ix,iy,drawing,temp_img
if event == cv2.EVENT_LBUTTONDOWN: # 左键按下,开始绘制
drawing=True
ix, iy = x, y
elif event==cv2.EVENT_MOUSEMOVE:
if drawing and flags==cv2.EVENT_FLAG_LBUTTON:
temp_img=img.copy()#清楚之前的绘制,保存上一次的图像
cv2.rectangle(img,(ix,iy),(x,y),(0,0,255),-1)
cv2.imshow('photo',temp_img)
elif event==cv2.EVENT_LBUTTONUP:
drawing==False
cv2.rectangle(img,(ix,iy),(x,y),(0,0,225),1)
print(f"起始点(ix,iy):{ix,iy},结束点(x,y):{x,y}")
cv2.namedWindow("photo",0)
cv2.setMouseCallback('photo',get_point)
cv2.imshow("photo",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
终端的输出红色感兴趣区域的坐标如下:
起始点(ix,iy):(31, 59),结束点(x,y):(64, 92)
所以可以依照此进行切片处理,选择感兴趣的区域,但是要注意坐标和切片顺序之间的关系
三.模式匹配黑桃花色
import cv2
import numpy as np
from matplotlib import pyplot as plt
#读取图像
img=cv2.imread("pukepai.jpg")
#img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#截取roi
img_cut=img[256:287,32:59]
#img_cut_gray=cv2.cvtColor(img_cut,cv2.COLOR_BGR2GRAY)#灰度
template=img_cut
w,h,COLOR=template.shape
threshold=0.9
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
loc=np.where(res>=threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img,pt,(pt[0]+w,pt[1]+h),(0,0,255),2)
#展示
cv2.imshow("pu_ke_pai",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
四.总结
通过增加一个大点的模板相信也可以匹配出中间大的黑桃,再多一个倒置的模版,相信也可以匹配出倒置的黑桃,读者可以自己尝试。