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

简介: 象棋棋谱之棋子识别(二)
  • 先来张效果图


网络异常,图片无法展示
|


  • 处理的方式


图像灰度化->二值化处理->形态学(膨胀)->轮廓提取->得到矩形边框->数据过滤->图像提取->图像匹配
复制代码


  • 得到轮廓矩形边框


#根据轮廓获取最小矩形边框
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
复制代码


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


网络异常,图片无法展示
|

相关文章
象棋棋谱之棋子识别(三)
象棋棋谱之棋子识别(三)
795 1
|
6月前
|
存储 Python 容器
每日一题 2013. 检测正方形
每日一题 2013. 检测正方形
牛客竞赛21842 正方形检测
牛客竞赛21842 正方形检测
最原始的扫雷,最适合休闲时乐一乐。
最原始的扫雷,最适合休闲时乐一乐。
771. 宝石与石头
 给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。   示例 1: 输入:jewels = "aA", stones = "aAAbbbb" 输出:3 示例 2: 输入:jewels = "z", stones = "ZZ" 输出:0   提示: 1 <= jewels.length, stones.length <= 50 jewels 和 stones 仅由英文字母组成
88 0
|
Java C++ Python
受伤的皇后——21年模拟赛
受伤的皇后——21年模拟赛
79 0
|
C语言
国王的许诺 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第1个格子中
国王的许诺 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第1个格子中
406 0
|
Java
Java锤子剪刀布大家应该都会玩“锤子剪刀布”的游戏: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
Java锤子剪刀布大家应该都会玩“锤子剪刀布”的游戏: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
165 0
|
测试技术 Android开发
autojs象棋识别棋子
牙叔教程 简单易懂
185 0