好吧,希望有人能帮我解决这个问题,因为我在这里不知所措。
我正在使用 python 开发一款游戏,该游戏使用相机作为主 Controller 。要玩这个游戏,您只需四处移动一个简单的灯,它就可以控制游戏。
到目前为止,我已经设法将相机图像放到表面上,并将其显示在屏幕上。但是,在寻找光线时,程序会慢得像爬行一样。
我第一次尝试使用 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 docs显示使用此方法一次获取像素 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(surface) 会更快(因为没有复制实际值),但不幸的是我的相机图像不是 24 位或 32 位格式。 所以,这是我的问题:
在pygame中,有没有快速读取所有像素的方法?
我必须能够读取每个像素,对其进行 lum 计算,(maxcolor+mincolor)/2,然后查看它的 lum 是否为最大 lum。感谢您的宝贵时间。
最佳答案
surfarray
对象似乎是由 numpy 数组支持的,因此您能否更快地获得它取决于它们的 native 方法。
看看这个:numpy.argmax
您可能需要先将 3d 数组转换为 2d 光度矩阵(但不要使用嵌套循环!XD)。也许您需要进行一些整形以获得平面,然后通过简单的矩阵运算对它们进行平均...或者您可以切换到其他更易于使用的图像格式,例如 HSV 或灰度,而不是使用 RGB。
关于python - Pygame快速像素读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743545/