Изображение процесса со скриншота - Python - PullRequest
1 голос
/ 16 января 2012

Я пытаюсь сделать скриншот игры, украшенный драгоценными камнями (доска 8x8), и извлечь положение доски из скриншота.Я пробовал Image / Imagestat, autopy и захват отдельных пикселей с середины слотов, но они не сработали.Поэтому я думаю, что взятие среднего значения для каждого квадрата сетки 8x8 идентифицирует каждый фрагмент - но я не смог сделать это с помощью Image / Imagestat и autopy.

Кто-нибудь знает способ получитьПиксельные или цветовые значения для области изображения?Или лучший способ идентифицировать сегменты изображения с доминирующим цветом?

1 Ответ

1 голос
/ 17 января 2012

Я нашел способ сделать это с помощью PIL, используя Imagegrab и ImageStat.Вот захват экрана и обрезка до игрового окна:

def getScreen():
    # Grab image and crop it to the desired window. Find pixel borders manually.
    box = (left, top, right, bottom)        
    im = ImageGrab.grab().crop(box)
    #im.save('testcrop.jpg')  # optionally save your crop

    for y in reversed(range(8)):
        for x in reversed(range(8)):
            #sqh,sqw are the height and width of each piece.
            #each pieceim is one of the game piece squares
            piecebox = ( sqw*(x), sqh*(y), sqw*(x+1), sqh*(y+1))
            pieceim = im.crop(piecebox)
            #pieceim.save('piececrop_xy_'+ str(x) + str(y) + '.jpg')

            stats = ImageStat.Stat(pieceim)
            statsmean = stats.mean
            Rows[x][y] = whichpiece(statsmean)

Вышеприведенное создает изображение для всех 64 фигур, идентифицирует тип фрагмента и сохраняет его в массиве массивов 'Rows'.Затем я взял средние значения RGB с помощью stats.mean для каждого типа куска и сохранил их в словаре (rgbdict).Скопируйте все выходные данные в Excel и отфильтруйте по типу цвета, чтобы получить эти средние значения.Затем я использовал метод RSS и этот словарь для статистического сопоставления изображений с известными кусочками.(RSS ref: http://www.charlesrcook.com/archive/2010/09/05/creating-a-bejeweled-blitz-bot-in-c.aspx)

rgbdict = {
           'blue':[65.48478993, 149.0030965, 179.4636593],  #1
           'red':[105.3613444,55.95710092, 36.07481793],   #2
           ......
            }
 def whichpiece(statsmean):
        bestScore = 100
        curScore= 0
        pieceColor = 'empty'
        for key in rgbdict.keys():
            curScore = (math.pow( (statsmean[0]/255) - (rgbdict[key][0]/255), 2)
                +  math.pow( (statsmean[1]/255) - (rgbdict[key][1]/255), 2)
                +  math.pow( (statsmean[2]/255) - (rgbdict[key][2]/255), 2) )
            if curScore < bestScore:
                pieceColor = key
                bestScore = curScore  
        return piececolor

С помощью этих двух функций можно очистить экран и перенести состояние доски в массив, по которому можно определять ходы. Удачи, если это кому-нибудь поможет, идайте мне знать, если вы точно настроите сборщик ходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...