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文档的快速检查显示,使用这种方法每次获取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中,是否有快速读取所有像素的方法?

我必须能够读取每个像素,对它进行最小值计算,(maxcolor+mincolor)/2,然后看看它的最小值是否是最大最小值。感谢您的宝贵时间。

似乎surfarray对象是由numpy数组支持的,所以你获得它更快的机会是依赖于它们的本机方法。

看看这个:numpy.argmax

你可能需要先将3d数组转换为2d亮度矩阵(但不要使用嵌套循环!)XD)。也许你需要一些重塑来获得平面,然后用简单的矩阵运算平均它们……或者你可以切换到其他更容易处理的图像格式,比如HSV或灰度。

不知道Pygame是否有特定的方法,但在许多python程序中有一种简单的方法可以加速许多事情:使用Psycho,参见这里

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

我想到的另一件事是:为什么你必须通过逐像素阅读来"找到光"?光的位置不是你事先就知道的东西吗,所以你可以检查相机的位置相对于光的位置?

最新更新