Pygame快速像素读取

时间:2011-10-12 16:45:10

标签: python algorithm image image-processing 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 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(表面)会更快(因为没有复制实际值),但不幸的是我的相机图像不是24或32位格式。 所以,这是我的问题:

在pygame中,有没有快速阅读所有像素的方法?

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

2 个答案:

答案 0 :(得分:2)

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

看看这个:numpy.argmax

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

答案 1 :(得分:0)

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

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

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