Pygame быстрое чтение пикселей - PullRequest
3 голосов
/ 12 октября 2011

Хорошо, надеюсь, кто-то может помочь мне с этим, потому что я в растерянности.

Я работаю над игрой на python, которая использует камеру в качестве основного контроллера. Чтобы играть в игру, вы перемещаете простой источник света, и он управляет игрой.

Пока мне удалось вывести изображение с камеры на поверхность и вывести его на экран. Но когда дело доходит до поиска света, программа замедляется до ползания.

Моя первая попытка использовала функцию surface.get_at (x, y) (это не фактический код, это пример):

maxL = 0
point = (0,0)
mysurface = get_cameraImg()
for i in range(mysurface.get_width()):
    for j in range(mysurface.get_height()):
        color = mysurface.get_at(i,j)
        lum = get_lum(color.r,color.g,color.b)
        if(lum>maxL):
            maxL = lum
            point = (i,j)

Это было ужасно медленно, поэтому я начал проводить свои исследования. Быстрая проверка документов pygame показала, что получение пикселей 1 за один раз с использованием этого метода будет медленным. Итак, я начал пытаться использовать Surfarray:

maxL = 0
point = (0,0)
mysurface = get_cameraImg()
ar = pygame.surfarray.array3d(mysurface)
for i in range(len(ar)):
    for j in range(len(ar[i]):
        color = ar[i][j]
        lum = get_lum(color[0],color[1],color[2])
        if(lum>maxL):
            maxL = lum
            point = (i,j)

Однако это тоже было слишком медленно. Быстрая двойная проверка документации по surfarray показала, что pygame.surfarray.pixels3d (поверхность) будет быстрее (поскольку фактическое значение не копируется), но, к сожалению, изображение с моей камеры не имеет формат 24 или 32 бита. Итак, вот мой вопрос:

В pygame есть какой-нибудь быстрый способ прочитать ВСЕ пиксели?

Я должен быть в состоянии прочитать каждый пиксель, выполнить подсчет яркости на нем (maxcolor + mincolor) / 2, а затем посмотреть, является ли его яркость максимальным значением lum. Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Похоже, что объект surfarray поддерживается множественными массивами, поэтому ваши шансы получить его быстрее зависят от их собственных методов.

Взгляните на это: numpy.argmax

Возможно, вам придется сначала преобразовать ваш 3d-массив в матрицу 2-мерной яркости (но не делайте этого с помощью вложенных циклов! XD).Возможно, вам понадобится изменить форму, чтобы получить плоскости, а затем усреднить их с помощью простых матричных операций ... Или вместо работы в RGB вы можете переключиться на другой формат изображения, с которым легче работать, например, HSV или просто в оттенках серого.

0 голосов
/ 12 октября 2011

Не знаю, есть ли способ, специфичный для Pygame, но есть простой способ ускорить многие вещи во многих программах на Python: используйте Psycho, см. Здесь

http://psyco.sourceforge.net/introduction.html

Еще одна вещь, которая приходит мне в голову: почему вы должны «найти свет», читая попиксельно? Разве положение света не является тем, что вы уже знаете заранее, так что вы можете просто проверить положение камеры относительно положения света?

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