Pygame Tutorials
Camera Module Introduction
by Nirav Patel
nrp@eclecti.cc
Revision 1.0, May 25th, 2009
原文:https://www.pygame.org/docs/tut/CameraIntro.html
感谢这个翻译插件A+ Dictionary 从此妈妈再也不用担心我的英语学习了!!
tips:看本文之前一定要安装pygame哟!sudo apt-get install python-pygame
Pygame 1.9开始已经提供了对摄像头的支持,允许你抓取静止的图片,观看实时的画面,和一些简(chou)单(lou)的电脑特效。这个教程将会包含以上功能的用法,并提供简单的代码供做参考。你也可以参考pygame.camera的文档查看详细的API。
提示:作为Pygame1.9,camera模块支持linux上使用v4l2的摄像头。其他平台可以使用 Videocapture(win) 或者 Opencv(Opencv麻烦是麻烦,可是实在很强大!),本教程的重点在本地模块。大部分的代码可以在其他平台是使用,不过某些类似控制的操作也许不能正常工作。本模块依旧是实验性的,意味着在后续的版本中API可能会发生变动。
引入和初始化
摄像头模块是可选的。需要被引入和手动初始化。如上
抓取一张图片
现在,我们来在最简单的情况下打开摄像头并且从中抓取一帧图片。在接下来的例子中,我们假设在你的电脑中摄像头叫做’/dev/video0’,我们将摄像头视频的大小设置为宽640高480.我们用 get_image()来抓取图像。
列出连接的摄像头
如果我们不能确定摄像头的真实路径?我们就可以使用 list_cameras()列出摄像头的列表,选取其中我们需要使用的那个(如果你有多个摄像头的话)
控制摄像头
大多数摄像头提供像翻转图像和调整亮度的功能。set_controls() 和 get_controls() 要在 start() 后使用。
实时画面
本教程接下就开始可以看到实时画面了。
过程很简单,就是不停的从摄像头中获取视频帧然后绘制在屏幕上,有效的显示实时画面。基本上你期望也是这样吧。不停的 get_image(),然后显示,刷新,循环。因为性能的原因,我们使用每次都使用同样的显示表面。
因为get_image()是一个阻塞的动作,也许会在差摄像头上花费很多的时间,所以我们用 query_image()来确定摄像头是否准备好。同时可以让显示画面的帧率和摄像头的帧率分开来,并能够保障在一个单独的线程中抓取摄像头中的图像.当然如果你的摄像头支持 query_image()操作的话,这样可以有更好的性能保障。
基本的显示效果
Pygame 可以做一些基本的视觉效果(滤镜),变形,遮罩……
色彩空间
当你初始化摄像头的时候,有一个色彩空间的可选常数,有 ‘RGB’, ‘YUV’, 和 ‘HSV’。在计算机视觉中 YUV 和 HSV 通常来说比 RGB 更有用。降低了颜色的阈值。
self.cam = pygame.camera.Camera(self.clist[0], self.size, "RGB")
self.cam = pygame.camera.Camera(self.clist[0], self.size, "YUV")
self.cam = pygame.camera.Camera(self.clist[0], self.size, "HSV")
阈值
在变换模块中使用threshold()我们可做出来像下面的绿屏效果,在特定的场景中分离出特定的颜色。在接下来的例子中,我们分离出绿色的树,剩下的全部变黑。详细的使用方法看threshold function
不过这只能用来寻找你知道准确颜色的对象。为了能够在现实的环境下方便的使用,我们增加一个校验机制来对对象的颜色进行辨认,并以此作为阈值。对此我们需要使用 average_color()这个方法。
下面的例子就是在方框中取得颜色,然后将此颜色作为其中的常数在 threshold()方法中使用。Note:这一部分我们都使用的是 HSV 色彩空间。
pygame.transform.threshold(self.thresholded,self.snapshot,self.ccolor,(30,30,30),(0,0,0),2)
我自己做出来的效果:
我们可以同样的来做一个绿/蓝色屏幕,首先我们得到背景颜色,然后将背景色替换为绿色,其他不是背景的为黑色。
这是相机对准空白的墙壁。
pygame.transform.threshold(self.thresholded,self.snapshot,(0,255,0),(30,30,30),(0,0,0),1,self.background)
使用遮罩模块
这个玩意你可以用来显示图像,使用这个模块你也可以使用摄像头作为游戏的输入。上个例子,我们使用阈值分离出了特定的对象,现在,我们来找到这个对象的位置,然后使用它来控制屏幕上的小球。
这只是些基本的例子。你还可以跟踪不同颜色的斑点,描绘物体的轮廓,现实世界和游戏世界中的物体碰撞检测。得到一个物体的角度,然后精确的控制它。
more and have fun!
我的[渣代码]:
用滑块控制颜色,自定义threshold()的三个颜色参数。
获取颜色,然后追踪。