Python Pygame快速像素读取

Python Pygame快速像素读取,python,algorithm,image,image-processing,pygame,Python,Algorithm,Image,Image Processing,Pygame,好吧,希望有人能帮我,因为我在这里不知所措 我正在用python开发一个游戏,它使用相机作为主控制器。要玩游戏,你需要移动一盏简单的灯,它控制游戏 到目前为止,我已经成功地将相机图像移到表面,并将其显示在屏幕上。但在寻找光明的问题上,该计划进展缓慢 我的第一次尝试使用了surface.get_at(x,y)函数(这不是实际代码,这是一个示例): 这是可怕的缓慢,所以我开始做我的研究。对的快速检查表明,使用此方法一次获取1个像素会很慢。于是我开始尝试使用surfarray: maxL = 0 po

好吧,希望有人能帮我,因为我在这里不知所措

我正在用python开发一个游戏,它使用相机作为主控制器。要玩游戏,你需要移动一盏简单的灯,它控制游戏

到目前为止,我已经成功地将相机图像移到表面,并将其显示在屏幕上。但在寻找光明的问题上,该计划进展缓慢

我的第一次尝试使用了surface.get_at(x,y)函数(这不是实际代码,这是一个示例):

这是可怕的缓慢,所以我开始做我的研究。对的快速检查表明,使用此方法一次获取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是否是max lum。谢谢您的时间。

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


我脑海中浮现的另一件事是:为什么你必须通过逐像素阅读来“找到光”?灯光的位置不是你事先就知道的吗,所以你可以只检查相机相对于灯光位置的位置?

看起来
surfarray
对象是由numpy数组支持的,所以你更快地获得它的机会取决于它们的本机方法

看看这个:


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

摄像头固定到位,您可以通过移动手中的一个小LED灯来控制游戏,因此我不知道灯在哪里。我发现找到光线的最简单的方法是找到亮度最高的点。至于psyco,我会研究一下,但我仍然相信我缺少一个简单的算法。许多游戏要求你在开始时设置控制器,就像在wii中,当你必须指向中心时。。这会加快启动速度,然后你可以从那里出发吗???即使我让它们指向中心,我仍然需要处理相机图像以找到光线移动的位置。如前所述,这将涉及找到最高亮度的点。由于仍需执行计算,因此进行校准(如指向中心)不会加快游戏速度。不知道surfarray由numpy阵列支持。看起来sum()函数对于快速计算亮度以及查找最亮点的argmax非常有用。谢谢你的帮助!由于亮度计算是(maxcolor+mincolor)/2,所以我认为最好的方法是获得3d数组ar,然后使用ar.max(3)和ar.min(3)创建2个2d数组(以获得max/mincolor),然后只需lumar=(maxar+minar)/2,最后只需一个argmax或max来找到lumar中的最高点。是的,嵌套循环可能是导致速度下降的原因=s
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)