象棋棋谱之棋子识别(二)

象棋棋谱之棋子识别(二)利用opencv识别象棋的棋子思路例子,和遇到的问题一些处理办法,例如数据的过滤,轮廓排序再识别的时候依据高度排序的时候轮廓的高度有偏差的简单处理

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

来源:公众号「冒泡的肥皂

转载请联系授权(微信ID:wxid_yhudfewbgu6c21)

  • 先来张效果图

图片

  • 处理的方式
图像灰度化->二值化处理->形态学(膨胀)->轮廓提取->得到矩形边框->数据过滤->图像提取->图像匹配
  • 得到轮廓矩形边框
#根据轮廓获取最小矩形边框

x, y, w, h = cv.boundingRect(cnts[i])

图片

  • 数据过滤
#轮廓获取得到的是上面图,下面的会有一些干扰项#通过拿到边框的坐标,然后根据宽高的比例进行过滤,我这里根据宽高的差 
x, y, w, h = cv.boundingRect(cnts[i])
   print(x,y,w,h)
   if(abs(w-h)>20):
     continue
  • 数据识别
#识别之前要做的是边框排序,根据上面拿到的轮廓数据#这里按照Y,X递增的方式进行

questionCnts2 = sorted(questionCnts.copy(), key=lambda x: (x[1],x[0]))

#排序我这里遇到了问题,因为每行棋子识别的时候,坐标有些高低差导致排序结果可能跟棋盘显示有些出入#其实识别之后可以根据上一篇文章得到的棋盘表格一步一步的得到棋子,我这里没做#我用了个笨办法处理的 就是每行的Y轴根据个大致范围固定了 

if abs(y - 19) < 20:
   y = 19
 if abs(y - 88) < 20:
   y = 88  

#拿到了边框后我们可以根据边框截取抠图了  
x, y, w, h = questionCnts2[i]    
# print(x, y, w, h)  
im = img[y:y + h, x:x + w]    
#抠图后然后根据模板匹配算法得到最匹配的模板   

result = cv.matchTemplate(cv.resize(old_img,None,fx=0.8, fy=0.8, interpolation = cv.INTER_CUBIC),tempImg,cv.TM_CCOEFF)   
(_, score, _, _) = cv.minMaxLoc(result)   
if check_score == 0 or score > check_score:
   #最大得分项
   check_score = score
   #最大得分项的文件名,然后根据字典获取棋子名称 
   check_img = fileName
  • 最终效果图

    这里可以再完善下通过上一篇获取的棋盘信息进行棋盘保存

图片

今天的文章象棋棋谱之棋子识别(二)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59552.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注