关闭

用python玩微信跳一跳系列-色块轮廓定位棋盘

标签: python微信游戏
262人阅读 评论(0) 收藏 举报
分类:

在前几篇博文中,我们分别采用颜色识别,模板匹配,像素遍历等方法实现了棋子和棋盘的定位,具体内容可以参见我的前面的文章内容,在这一篇中,我们来探索一种定位棋盘的新方法。
分析
经过观察,我们看到,无论什么情况下,棋盘和背景之间总是存在着非常明显的色彩对比,这当然是必须的,否则玩游戏的人都无法分辨棋子、棋盘、背景,这个游戏就不可能大火。显然,如果我们将每一幅画面进行色块分割,将彩色图转变为黑白二值图,就可以将背景和棋盘隔离出来,然后对黑白图中的白色轮廓进行分析,将其中位置最高(y值最小)的轮廓标记出来,这个轮廓就是下一步要跳一跳的棋盘。
步骤

  1. 抓取图像;
  2. 将图像转变为灰度图;
  3. 确定工作区域(h//3–2h//3),确定像素阈值;
  4. 产生黑白二值图像,同时产生两种黑白图,分别将亮于背景和暗于背景两种情况下的色块隔离出来;
    阴影的处理
    棋盘往往会有阴影,可以通过进一步缩小目标区域进行色块分割的方法来精准实现定位,感兴趣的同学可以自行练习。
    代码
# -*- coding: utf-8 -*-
#VS2017+python3.6+opencv3.4
#2018.02.03
#作者:艾克思

import cv2  

def thresh(img):
    x1,y1,w1,h1,x2,y2,w2,h2=0,0,0,0,0,0,0,0
    gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #gray=cv2.GaussianBlur(gray,(13,13),0)  #高斯模糊
    h0,w0=img.shape[:2]
    top=gray[h0//3,10]
    bottom= gray[h0*2//3,10]

    thresh1 = cv2.threshold(gray,top,255, cv2.THRESH_BINARY)[1] 
    thresh2 = cv2.threshold(gray,bottom,255, cv2.THRESH_BINARY_INV)[1]  
    img1=thresh1[h0//3:h0*2//3,0:w0]
    img2=thresh2[h0//3:h0*2//3,0:w0]

    cnts1, hierarchy1, rr1 = cv2.findContours(img1,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts2, hierarchy2, rr2 = cv2.findContours(img2,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    aim1=0
    y_min=h0//3
    for c in hierarchy1:
        if hierarchy1==None:
            x1,y1,w1,h1=w0//2,h0//3,w0//3,h0//3
            break
        else:
            x,y,w,h = cv2.boundingRect(c)
            if y<=y_min:
                y_min=y
                aim1=c
            x1,y1,w1,h1 = cv2.boundingRect(aim1)
    cv2.rectangle(img,(x1,y1+h0//3),(x1+w1,y1+h1+h0//3),(255,0,0),2)

    aim2=0
    y_min=h0//3
    for c in hierarchy2:
        if hierarchy2==None:
            x2,y2,w2,h2=w0//2,h0//3,w0//3,h0//3
            break
        else:
            x,y,w,h = cv2.boundingRect(c)
            if y<=y_min:
                y_min=y
                aim2=c
            x2,y2,w2,h2 = cv2.boundingRect(aim2)
    cv2.rectangle(img,(x2,y2+h0//3),(x2+w2,y2+h2+h0//3),(0,255,0),2)

    if y1+h1//2<=y2+h2//2:
        x,y,w,h=x1,y1,w1,h1
    else: x,y,w,h=x2,y2,w2,h2

    cv2.imshow('img1',thresh1)
    cv2.imshow('img2',thresh2) 

    return (x+w//2,y+h0//3+h//2)

def main():
    video='jump.avi'
    cap = cv2.VideoCapture(video)  
    ret=cap.isOpened()
    ret=True
    while ret:
        #ret,img=cap.read()  #读入帧
        img=cv2.imread('e:/python/jump/hsv/006.png')
        if not ret:cv2.waitKey(0)
        point=thresh(img)
        cv2.circle(img,point,3,(0,0,255),-1)
        cv2.circle(img,point,15,(0,0,255),2)

        cv2.imshow('img',img)
        if cv2.waitKey(25)==ord('q'): break
    cap.release()
    cv2.destroyAllWindows()

if __name__=='__main__':
    main()

opencv中关于黑白二值分割的参数类型如下:
这里写图片描述
在代码编制时,需要将cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV联合使用,以便同时分辨亮色和暗色。
效果
​我们放几张棋盘识别的样例,共大家参考。
这里写图片描述
这是一张比较典型的样例图,棋盘上半部分为暗色,下半部分为亮色,第一张是亮色部分的分割识别,第二张是暗色部分的分割识别,最后分别绘出各自识别出的色块轮廓,并进行比较。这张样例中,最终识别出的位置在棋盘的中心白点上,效果还是非常好的。
这里写图片描述
这也是一张非常典型的样例图,棋盘亮暗部分相互交错,左边图识别出了亮色部分,中间图识别出了暗色部分,最终的比较结果也在棋盘的正中心,效果不错。
这里写图片描述
这张样例也将最终的位置锁定在棋盘中心点。
再放一张。
这里写图片描述
这也是一张比较典型的情况,最终定位在棋盘的中心白点处,方法可行。

0
0
查看评论

Python图像处理之“跳一跳”游戏如何确定棋子与棋盘中心坐标

先上原图: 附上调试代码: # _*_ coding:utf-8 _*_ __author__ = 'admin' from PIL import Image, ImageDraw, ImageFont im = Image.open(r'C:\Use...
  • FloatDreamed
  • FloatDreamed
  • 2018-01-11 18:07
  • 556

用python玩微信跳一跳系列-小人识别之模板匹配

前言 在opencv中,模板匹配进行物体识别有专门的函数matchTemplate()来执行这一动作。这个函数用来在给定图像或区域中进行模板图像的匹配,其做法是按照一定的计算方法将模板图像在给定图样中进行顺次滑移,最终将每一个位置的计算结果汇合成一个点阵。在这个点阵中,其最大值或者最小值就是我们需...
  • m0_37606112
  • m0_37606112
  • 2018-01-09 22:41
  • 222

使用Python玩微信跳一跳教程

在上一篇文章里介绍了使用Python玩微信跳一跳的详细使用教程,不过依旧还是有很多小伙伴有各种各样的问题。为了让各位小伙伴都能使用黑科技,于是再做一个超详细教程。从Python的安装开始,手把手教你一步一步配置好环境直到成功运行。 本文适用对象为WIN10系统,安卓用户。目的在于让丝毫没有接触过P...
  • Paranoid99
  • Paranoid99
  • 2018-01-07 19:16
  • 417

教你用Python来玩微信跳一跳

转自http://tieba.baidu.com/p/5501481925?traceid= 2017年12月28日下午,微信发布了 6.6.1 版本,加入了「小游戏」功能,并提供了官方 demo「跳一跳」。 具体玩法 1、跳一个方块加 1 分。 2、连续跳到方块的中心点,得分会...
  • qq_31776303
  • qq_31776303
  • 2018-01-07 14:43
  • 1100

安卓+windows7下,用python玩微信跳一跳经验总结

原github地址:https://github.com/wangshub/wechat_jump_game 里面所有使用步骤方法都很详细,我就总结一下我实验过程中遇到的问题,供大家参考。 我用的环境是:win7 + 坚果pro 先上传一下代码压缩包,从github下载特别慢(侵删),链接:h...
  • u014256231
  • u014256231
  • 2018-01-04 16:34
  • 2100

教你用 Python 来玩微信跳一跳

原贴地址:  https://www.jianshu.com/p/925e63532290?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation ...
  • zhanglei1234321
  • zhanglei1234321
  • 2018-01-02 20:42
  • 1918

使用python进行微信跳一跳

1、Python2.79 2、安装pip 3、大家下载的时候把github上面的master zip全部下载下来。 4、下载adb,并添加到系统变量path里面 5、手机连接电脑,打开usb调试 6、打开cmd 运行auto.py
  • sinat_37390744
  • sinat_37390744
  • 2018-01-02 23:01
  • 4660

【游戏】教你用Python来玩微信跳一跳

工具介绍   Python 2.7   Android 手机   Adb 驱动         Python Matplot绘图 原理说明 : (转载自https://zhuanlan.zhihu.c...
  • g1fdgfgdf2_
  • g1fdgfgdf2_
  • 2018-01-11 11:44
  • 379

用 Python 从零开始玩微信跳一跳

关注 Python 的人想必都知道 跳一跳辅助外挂 这个项目近来在 Github 上火得不行,相信不少人也可能尝试过一番,并暗暗叹息,为什么我一开始就没有这个好想法呢!现在,参照外挂项目的源码,我们就从零开始来自己动手写一个手动版本的跳一跳外挂。思路:1、利用 adb 命令先把跳...
  • BF02jgtRS00XKtCx
  • BF02jgtRS00XKtCx
  • 2018-01-12 00:00
  • 391

王者逆袭:教你用人工智能玩微信跳一跳,高分逆袭!

最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每一个人都在刷跳一跳,作为无(zhi)所(hui)不(ban)能(zhuan)的AI程序员,我们在想,能不能用人工智能(AI)和计算机视觉(CV)的方法来玩一玩这个游戏?于是,我们开发了微信跳一跳Auto-Jump算法,重新定义了玩跳一跳...
  • r6Auo52bK
  • r6Auo52bK
  • 2018-01-12 00:00
  • 403
    个人资料
    • 访问:15391次
    • 积分:743
    • 等级:
    • 排名:千里之外
    • 原创:57篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论