Хорошо, надеюсь, кто-то может помочь мне с этим, потому что я в растерянности.
Я работаю над игрой на 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. Спасибо за ваше время.