好吧,希望有人能帮助我,因为我在这里不知所措。
我正在使用相机作为主控制器的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是否是最大值。谢谢你的时间。
答案 0 :(得分:2)
surfarray
对象似乎由numpy数组支持,所以你获得它的机会更多依赖于它们的原生方法。
看看这个:numpy.argmax
您可能需要先将3d数组转换为2d光度矩阵(但不要使用嵌套循环!XD)。也许你需要一些重塑来获得平面,然后用简单的矩阵运算来平均它们......或者你可以切换到更容易使用HSV或灰度等其他图像格式。 / p>
答案 1 :(得分:0)
不知道是否有特定于Pygame的方式,但有一种简单的方法可以在许多python程序中加速很多事情:使用Psycho,请看这里
http://psyco.sourceforge.net/introduction.html
我想到的另一件事是:为什么你必须找到光线"通过逐像素读取?不是事先已经知道的光的位置,所以你可以检查相对于光位置的相机位置吗?