【好玩的计算机视觉】自动玩寻找不一样的色彩4399小游戏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/littlethunder/article/details/51713234

在4399上玩了一个寻找不一样的色彩小游戏,如下图所示:


目的就是找到颜色不同的方块,点一次升一次级,限定时间25秒,点的快时间可以不变。最开始2x2,3x3,4x4,5x5等等逐渐增多,最后9x9不变。我的思路首先是截一张图,这里我用的是pyscreenshot模块,让用户用鼠标点击游戏总方块的左上顶角和右下顶角,这样确定了目标区域。以9x9的时候为例,代码如下:


import cv2
import numpy as np
import os
import pyscreenshot as ss
import time

def onMouse(event, x, y, flags, param):
    global flag, pLeftTop, pRightBottom
    if event == cv2.EVENT_LBUTTONDOWN:
        if flag:
            pLeftTop = (x,y)
        else:
            pRightBottom = (x,y)
        flag = False

flag = True
pLeftTop = None
pRightBottom = None

cv2.namedWindow('frame')
cv2.setMouseCallback('frame', onMouse)

img = ss.grab(bbox=(0,0,1300,768))
img = np.array(img)
cv2.imshow('frame', img)
if cv2.waitKey(0) & 0xff == ord(' '):
    cv2.destroyWindow('frame')

flag, pLeftTop, pRightBottom是全局变量,onMouse是获取鼠标的回调函数。

while True:
    img = ss.grab(bbox=(0,0,1300,768))
    img = np.array(img)
    target = img[pLeftTop[1]:pRightBottom[1],pLeftTop[0]:pRightBottom[0]]
    gray = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY_INV)

接下来二值化处理,我这里设的阈值是220,取反处理,结果如下:


    im, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    centers = []
    centersGray = []
    #d = 0
    for c in contours:
        (x,y), radius = cv2.minEnclosingCircle(c)
        x, y = int(x), int(y)
        centers.append((x,y))
        centersGray.append(gray[y,x])
        #d+=1
        #cv2.circle(target, (x,y), 2, (0,255,0), 2)
        #cv2.putText(target, str(d), (x,y), cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,0))

接下来通过边界找到所有的颜色方块,取消上面代码的注释可以看到如下:


    sets = set(centersGray)
    index = None
    for s in sets:
        if centersGray.count(s) == 1:
            index = centersGray.index(s)
            break
接下来就是找到不同的那个颜色块,可以通过list的自带count函数快速找到,在图上显示就是:



    realX = centers[index][0] + pLeftTop[0]
    realY = centers[index][1] + pLeftTop[1]
    os.system('xdotool mousemove '+str(realX)+' '+str(realY))
    os.system('xdotool click 1')

最后获取屏幕上真实的像素位置,用xdotool模拟鼠标移动和点击即可。

演示视频:http://www.bilibili.com/video/av5023951/

完整代码: https://github.com/littlethunder/autoFindColorGame


转载请注明: 转自http://blog.csdn.net/littlethunder/article/details/51713234

猜你喜欢

转载自blog.csdn.net/littlethunder/article/details/51713234