Pygame快速像素读取
好的,希望有人能帮我解决这个问题,因为我现在真的不知道该怎么办了。
我正在用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的文档,发现用这种方法逐个获取像素会很慢。于是我开始尝试使用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中,有没有什么快速的方法可以读取所有像素?
我需要能够读取每一个像素,计算它的亮度(maxcolor+mincolor)/2,然后看看它的亮度是否是最大的。谢谢你的时间。
2 个回答
我不知道有没有专门针对Pygame的加速方法,但有一种简单的方法可以让很多Python程序运行得更快,那就是使用Psycho,具体可以看看这里。
http://psyco.sourceforge.net/introduction.html
还有一个我想到的点是:为什么你要通过逐个读取像素来“找到光源”?难道光源的位置不是你事先就知道的吗?你可以直接检查相机的位置和光源的位置的关系啊。
看起来,surfarray
对象是基于numpy数组的,所以想要提高速度,就得依赖它们本身的方法。
你可以看看这个:numpy.argmax
你可能需要先把你的三维数组转换成二维的亮度矩阵(不过不要用嵌套循环来做!XD)。也许你需要进行一些形状调整来获取不同的层,然后用简单的矩阵运算来求平均……或者与其在RGB模式下工作,不如换成更容易处理的图像格式,比如HSV或者直接用灰度图。