树莓派 摄像头 python怎么用python2.7开启外接摄像头

如何在Raspberry Pi(树莓派)上调用V4L2来操纵摄像头拍照 - 树莓派论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
如何在Raspberry Pi(树莓派)上调用V4L2来操纵摄像头拍照
21:39:21  
如何在Raspberry Pi(树莓派)上调用V4L2来操纵摄像头拍照简单地说,它就是一个基于ARM CPU的、信用卡那么大的迷你计算机。
我曾经写过一篇教程,展示了如何调用OpenCV,来控制摄像头拍照。在那篇文章的末尾,我提到了一个遗留问题,即把抓取图像的尺寸设置得稍高一点的时候,那个程序就很容易崩溃;在图像尺寸设置得很低的时候,有时候也会崩溃,我一直没弄明白为什么。
但是在前段时间,由于参赛原因,被迫在很短的时间内解决这个棘手的问题。真可谓是搜了无数网页,最后采取了一种折衷的方式“在很大程度上”解决了这个问题——毕竟还不完美。
所以在这篇文章里,我打算介绍另一种方式来实现控制摄像头拍照,并且程序稳定得多(尽管程序还是会崩溃,但比OpenCV的版本少多了)。
1、把OpenCV换掉,选择知多少
当时我第一个想法就是把OpenCV换掉,但是我还有什么选择呢?我先找到了这个网页,它介绍了一种使用Python抓取摄像头图像的方法。但有个问题:如果你没有安装他们移植的系统(我应该没理解错吧...),那么就只能先按照要求安装他们提供的一些自定义library。很不巧,我使用的是Arch Linux ARM,所以当然要安装。不过,当我打开安装说明页之后,照做了几步之后,我就放弃了,因为太麻烦,路径都还要自己根据情况修改的,等我完全搞好之后,估计一个小时都过去了,而且还不一定能成。
于是我又找到了若干篇用V4L来实现图像抓取的文章(链接1,链接2),于是我抄来代码,在几乎看不懂的情况下,硬着头皮尝试去小修小改。
2、V4L2是什么
从前面提供的链接里,大家可以看到“V4L2 video picture grabber”的说明。V4L2是什么?从 这个Wiki页面 的部分内容:
Video4Linux or V4L is a video capture[1] and output device API and driver framework for the Linux kernel, supporting many USB webcams, TV tuners, and other devices. Video4Linux is closely integrated with the Linux kernel.
V4L2 is the second version of V4L. Video4Linux2 fixed some design bugs and started appearing in the 2.5.X kernels.
我们知道了V4L2是Linux内核的视频抓取和输出设备API和驱动框架,它支持非常多的USB摄像头等设备。所以,用它可以驱动摄像头抓取图像。
3、输出什么格式的图片
显然,我们想要摄像头抓取并输出jpg,png之类的图片,但是,前面链接1里的代码输出的是PPM格式的图片。于是我看到了这行代码:
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
这里显然是控制文件格式的。根据前面的链接2,我把它改成了jpg格式:
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG) {
&&printf(&Libv4l didn't accept jpg format. Can't proceed.\n&);
&&exit(EXIT_FAILURE);
可惜的是编译运行之后发现这里过不去,也就是不支持jpg格式。于是只能输出PPM格式的图片。PPM是“可移植像素图格式”的简称,它是没有压缩的,文件体积较大(一个640*480的PPM图片竟然有900多K),所以它既不利于存储也不利于网络传输。
4、PPM图片转换为jpg格式
前面我说过,最终得到摄像头抓取图片的方式是一种折衷的方式,这里就是一个体现:先拿到PPM,再转为jpg,实在是不得已而为之,因为通过调用V4L2抓取图像比较稳定,而我又无法让抓取图像的程序直接输出jpg格式的图片,因此就再转一下。
找来找去发现了用ImageMagick转格式很容易。于是先安装:
pacman -S imagemagick
安装好之后,它就带了一个名为“convert”的程序,转换命令不要太简单:
convert 1.ppm 1.jpg
这样就把1.ppm转换成了1.jpg。对320*240大小的图片,我感觉转换速度是非常快的。
5、完整代码
程序文件名为 webcam-stable.c :
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#include &fcntl.h&
#include &errno.h&
#include &sys/ioctl.h&
#include &sys/types.h&
#include &sys/time.h&
#include &sys/mman.h&
#include &linux/videodev2.h&
#include &libv4l2.h&
#include &libv4l1.h&
* A program to capture image via the camera.
* [url=home.php?mod=space&uid=40524]@author[/url] Darran Zhang @ codelast.com
#define CLEAR(x) memset(&(x), 0, sizeof(x))
struct buffer {
&&void& &*
&&size_
};
static void xioctl(int fh, int request, void *arg)
{
&&
&&do {
& & r = v4l2_ioctl(fh, request, arg);
&&} while (r == -1 && ((errno == EINTR) || (errno == EAGAIN)));
&&if (r == -1) {
& & fprintf(stderr, &error %d, %s\n&, errno, strerror(errno));
& & exit(EXIT_FAILURE);
&&}
}
int main(int argc, char **argv) {
&&if (argc & 4) {
& & printf(&Usage: ./webcam [outputImagePath] [outputImageWidth] [outputImageHeight]\nE.g. ./webcam webcam.jpg 320 240\n&);
& & return 1;
&&}
&&char* outputImagePath = argv[1];
&&int imageWidth = atoi(argv[2]);
&&int imageHeight = atoi(argv[3]);
&&struct v4l2_format& && && && &&&
&&struct v4l2_buffer& && && && &&&
&&struct v4l2_requestbuffers& && &
&&enum v4l2_buf_type& && && && &&&
&&fd_set& && && && && && && && &&&
&&struct timeval& && && && && && &
&&int& && && && && && && && && &&&r, fd = -1;
&&unsigned int& && && && && && &&&i, n_
&&char& && && && && && && && && & *dev_name = &/dev/video0&;
&&char& && && && && && && && && & out_name[256];
&&FILE& && && && && && && && && & *
&&struct buffer& && && && && && & *
&&fd = v4l2_open(dev_name, O_RDWR | O_NONBLOCK, 0);
&&if (fd & 0) {
& & perror(&Cannot open device&);
& & exit(EXIT_FAILURE);
&&}
&&CLEAR(fmt);
&&fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
&&fmt.fmt.pix.width& && & = imageW
&&fmt.fmt.pix.height& && &= imageH
&&fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
&&//fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
&&fmt.fmt.pix.field& && & = V4L2_FIELD_INTERLACED;
&&xioctl(fd, VIDIOC_S_FMT, &fmt);
&&if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24) {
& & printf(&Libv4l didn't accept RGB24 format. Can't proceed.\n&);
& & exit(EXIT_FAILURE);
&&}
&&if ((fmt.fmt.pix.width != imageWidth) || (fmt.fmt.pix.height != imageHeight))
& & printf(&Warning: driver is sending image at %dx%d\n&, fmt.fmt.pix.width, fmt.fmt.pix.height);
&&CLEAR(req);
&&req.count = 2;
&&req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
&&req.memory = V4L2_MEMORY_MMAP;
&&xioctl(fd, VIDIOC_REQBUFS, &req);
&&buffers = calloc(req.count, sizeof(*buffers));
&&for (n_buffers = 0; n_buffers & req. ++n_buffers) {
& & CLEAR(buf);
& & buf.type& && &&&= V4L2_BUF_TYPE_VIDEO_CAPTURE;
& & buf.memory& && &= V4L2_MEMORY_MMAP;
& & buf.index& && & = n_
& & xioctl(fd, VIDIOC_QUERYBUF, &buf);
& & buffers[n_buffers].length = buf.
& & buffers[n_buffers].start = v4l2_mmap(NULL, buf.length,
& && &PROT_READ | PROT_WRITE, MAP_SHARED,
& && &fd, buf.m.offset);
& & if (MAP_FAILED == buffers[n_buffers].start) {
& && &perror(&mmap&);
& && &exit(EXIT_FAILURE);
& & }
&&}
&&for (i = 0; i & n_ ++i) {
& & CLEAR(buf);
& & buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
& & buf.memory = V4L2_MEMORY_MMAP;
& & buf.index =
& & xioctl(fd, VIDIOC_QBUF, &buf);
&&}
&&type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
&&xioctl(fd, VIDIOC_STREAMON, &type);
&&do {
& & FD_ZERO(&fds);
& & FD_SET(fd, &fds);
& & /* Timeout. */
& & tv.tv_sec = 2;
& & tv.tv_usec = 0;
& & r = select(fd + 1, &fds, NULL, NULL, &tv);
&&} while ((r == -1 && (errno = EINTR)));
&&if (r == -1) {
& & perror(&select&);
& &
&&}
&&CLEAR(buf);
&&buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
&&buf.memory = V4L2_MEMORY_MMAP;
&&xioctl(fd, VIDIOC_DQBUF, &buf);
&&fout = fopen(outputImagePath, &w&);
&&if (!fout) {
& & perror(&Cannot open image&);
& & exit(EXIT_FAILURE);
&&}
&&fprintf(fout, &P6\n%d %d 255\n&,
& & fmt.fmt.pix.width, fmt.fmt.pix.height);
&&fwrite(buffers[buf.index].start, buf.bytesused, 1, fout);
&&fclose(fout);
&&xioctl(fd, VIDIOC_QBUF, &buf);
&&type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
&&xioctl(fd, VIDIOC_STREAMOFF, &type);
&&for (i = 0; i & n_ ++i) {
& & v4l2_munmap(buffers[i].start, buffers[i].length);
&&}
&&v4l2_close(fd);
&&return 0;
}复制代码
编译:
gcc webcam-stable.c -lv4l2 -o webcam-stable复制代码
程序运行时需要3个参数,分别是输出图片文件的路径、输出图片的宽度、输出图片的高度,例如:
./webcam-stable /home/codelast/1.ppm 320 240复制代码
用一个脚本,在输出图片之后,再将其转为jpg格式,就完成了我们的任务。
[1] 在解决上述问题的过程中,我遇到了无数的问题(例如编译时找不到某些库),因此为了解决那些问题,我安装了很多package,但我不确定它们是否全都需要,并且也没有来得及把它们全都记录下来,因此,我把记下来的写在这里,仅供参考:
pacman -S xf86-video-v4l复制代码
[2] 这个程序比OpenCV版的程序要稳定得多,体现在抓取成功(程序不提示错误)的机会大得多,但我得承认,它还是有问题的,有时候会出错:
error 12, Cannot allocate memory复制代码
然后就没能抓下来图片。看这提示是内存不够(我是512MB的Pi)?但具体原因我还是不知道为什么,如果你知道怎么优化,请不吝赐教。
13:33:31  
#在这里快速回复#太棒了&&谢谢分享
19:32:47  
辛苦了。。。。。。。。。。。。。
11:22:44  
还不错,谢谢分享.
助理工程师
13:54:16  
辛苦楼主了,,,
只有小组成员才能发言,
641个成员聚集在这个小组
创建小组步骤
创建小组创建自己的地盘
个性设置精心打造小组空间
邀请好友邀请好友加入我的小组
小组升级小组积分升级赢得社区推荐
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司在树莓派2或树莓派B+上安装Python和OpenCV的教程
转载 & & 作者:Adrian Rosebrock
这篇文章主要介绍了在树莓派2或树莓派B+上安装Python和OpenCV的教程,主要基于GTK库,并以Python2.7和OpenCV 2.4.X版本的安装作为示例,需要的朋友可以参考下
我的Raspberry Pi 2昨天刚邮到,这家伙看上去很小巧可爱。
这小家伙有4核900MHZ的处理器,1G内存。要知道,Raspberry Pi 2 可比我中学电脑实验室里大多数电脑快多了。
话说,自从Raspberry Pi 2发布以来,我收到了很多请求,要求我能写一个在它上面安装OpenCV和Python的详细说明。
因此如果你想在Raspberry Pi启动运行OpenCV和Python,就往下面看!
在博文的剩余部分,我将提供在Raspberry Pi 2 和Raspberry Pi B+上的详细安装说明。
我也会说明每一步的安装耗时。其中一些步骤需要较多的处理时间。举个例子,在Raspberry Pi 2 编译OpenCV花费大概2.8小时,在 Raspberry Pi B+上则是9.5小时。所以请你据此安排你的安装吧。
最后,提醒一下我们会在PyImageSearch Gurus 计算机视觉课程中用到Raspberry Pi。我们的项目将会包括家庭监控应用,例如说房间里面的运动检测和人员跟踪。
下面是一个运动检测和跟踪的简单例子,当时我正打着电话在公寓里面来回走动。
在 Raspberry Pi 2/B+上安装OpenCV和Python
这里假定你已经有了Raspberry Pi 2/B+,且已经安装好。如果没有的话,我建议你买一个,它们既便宜也好玩。
个人来说,我更愿意多花一点钱从买。他们的物流很快也比较可靠,加之他们的 ready-to-go服务也很好。
好吧,我们开始OpenCV和Python的安装
我们假定你已经打开Raspberry Pi 2/B+。打开终端,我们先更新和升级已安装的软件包,然后更新Raspberry Pi固件。
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo rpi-update
安装所需的安装工具和包:
$ sudo apt-get install build-essential cmake pkg-config
build-essential 和 pkg-config可能都已经安装。以防万一,我们还是将它们键入apt-get命令中。
Raspberry Pi B+:小于2分钟
Raspberry Pi 2:小于40秒
安装必要的图像I/O包,这样你才可以读入JPEG,PNG,TIFF等这些格式的图像。
$ sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev
Raspberry Pi B+: 小于5钟
Raspberry Pi 2: 小于30秒
安装GTK开发库,这个库用来构建GUI。同时OpenCV中的highgui库也需要它来在屏幕上显示图像。
$ sudo apt-get install libgtk2.0-dev
Raspberry Pi B+: 小于10分钟
Raspberry Pi 2:小于3分钟
安装必要的视频I/O包,OpenCV需要它们来读入视频文件。
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
Raspberry Pi B+: 小于5分钟
Raspberry Pi 2: 小于30秒
安装OpenCV优化操作时所需库。
$ sudo apt-get install libatlas-base-dev gfortran
Raspberry Pi B+:小于2分钟
Raspberry Pi 2:小于30秒
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
Raspberry Pi B+:小于2分钟
Raspberry Pi 2:小于30秒
安装virtualenv和virtualenvwrapper
$ sudo pip install virtualenv virtualenvwrapper
然后,更新~/.profile文件如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
重新载入.profile文件:
$ source ~/.profile
创建你的计算机视觉虚拟环境
$ mkvirtualenv cv
Raspberry Pi B+: 小于2分钟
Raspberry Pi 2: 小于2分钟
现在我们安装Python 2.7开发工具:
$ sudo apt-get install python2.7-dev
注意:我们将使用Python2.7。因为OpenCV 2.4.X不支持Python 3,也不太清楚OpenCV 3.0的python接口什么时候才能完善。所以我建议现在还是使用OpenCV2.4.X的好。
我们也需要安装NumPy,因为OpenCV的Python接口通过Numpy的多维数组来表示图像。
$ pip install numpy
Raspberry Pi B+: 小于45分钟
Raspberry Pi 2: 小于15分钟
下载和解压OpenCV:
$ wget -O opencv-2.4.10.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip/download
$ unzip opencv-2.4.10.zip
$ cd opencv-2.4.10
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON ..
Raspberry Pi B+: 小于3分钟
Raspberry Pi 2: 小于1.5分钟
编译OpenCV:
重要:确定你在cv虚拟环境中,OpenCV也要根据该环境中的Python和NumPy中进行编译。否则的话,OpenCV就会和系统中的Python和NumPy编译在一起,会产生各种问题。
Raspberry Pi B+: 小于 9.5 小时
Raspberry Pi 2: 小于2.8小时
最后,我们安装OpenCV:
$ sudo make install
$ sudo ldconfig
Raspberry Pi B+: 小于 3分钟
Raspberry Pi 2: 小于1分钟
进行到这一步的时候,OpenCV已经应该已经安装到/usr/local/lib/python2.7/site-packages中了。
但是为了在cv虚拟环境中使用OpenCV,我们先需要符合链接到我们的site-packages目录:
$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/
$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so
$ ln -s /usr/local/lib/python2.7/site-packages/cv.py cv.py
最后,我们测试一下OpenCV和Python的安装:
$ workon cv
&&& import cv2
&&& cv2.__version__
OpenCV和Python已经成功安装到你的Raspberry Pi了。
这是在我的Raspberry Pi上的运行例子,我ssh登录到 Raspberry Pi,然后读取和显示一幅图像。
这篇博文中,我详细介绍了如何在Raspberry Pi 2 /Raspberry Pi B+上安装Python和OpenCV。也提供了他们的安装耗时,请酌情考虑你的安装。
随着Raspberry Pi的升级,安装指令可能有所变化。如果你遇到一些极端情况或安装指令的变化,请随时。当然我也不能保证每封邮件都能回复,所以最好是将如何在 Raspberry Pi上安装OpenCV和Python的方法总结成一个列表。
不久以后,我会讲如何在Raspberry Pi操作其附加的camera。
在那之前,看看计算机视觉课程。我们将在其中一些工程中用到Raspberry Pi,就比如说构建一个监控应用来进行房间内部的运动检测和人员跟踪。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Raspberry Pi 3
树莓派3入门套件
Raspberry Pi zero W
管理员, 积分 20723, 距离下一级还需
一刷新就看到鱼总大作了
我要点赞 0
管理员, 积分 20723, 距离下一级还需
鱼X有没有摄像头啊
我要点赞 0
初级工程师, 积分 3549, 距离下一级还需 1451 积分
我要点赞 0
管理员, 积分 20723, 距离下一级还需
鱼X能拿到摄像头了,等鱼X出教程啊
我要点赞 0
初级技术员, 积分 0, 距离下一级还需 250 积分
是啊,是啊什么时候啊~
我要点赞 0
管理员, 积分 20723, 距离下一级还需
你也可以分享心德啊,一起交流
我要点赞 0
初级工程师, 积分 3549, 距离下一级还需 1451 积分
周末准备研究一下
我要点赞 0
初级技术员, 积分 0, 距离下一级还需 250 积分
好的,一起加油吧~
我要点赞 0
中级技术员, 积分 349, 距离下一级还需 351 积分
我喜欢!!
我要点赞 0
初级工程师, 积分 3549, 距离下一级还需 1451 积分
研究了下adafruit的pycam,发现图像的实时预览是通过把图像原始数据放进内存流,然后进行了一个yuv2rgb转换,然后读取内存流再用pygame显示的方式搞定的。
我要点赞 0
管理员勋章
社区管理员可以申请此勋章
只要认为你是屌丝的会员都可以申请此勋章
刀哥粉丝团
论坛会员边城的粉丝可以申请此勋章
辛勤耕耘勋章
发贴量加回贴量超过500的会员可申请此勋章
资源达人勋章
上传资料超过50的会员可以申请此勋章
社区土豪勋章
IC币超过10000的会员可以申请此勋章
大区版主勋章
任职超过一个版块的版主可以申请此勋章
树莓派高手勋章
在树莓派专区中发表精华类,原创类主题的可以申请此勋章树莓派瑞士军刀扩展板(SAKS)
树莓派瑞士军刀扩展板是由一系列元件经过精心构建而成的多功能扩展板,适用于40Pin GPIO口的树莓派系列。您可以基于树莓派主机和本产品学习树莓派GPIO的使用,开发出各种的上层软件,软硬件结合,研发出功能丰富的功能和应用。
树莓派 HiFiBox DAC 扩展板
HiFiBox DAC 是一款适用于树莓派的音频硬解码扩展板。支持 Volumio、BuneAudio、OSMC 等功能强大的播放软件,是快速搭建树莓派 HiFi 系统的不二之选!
关注我们的微信公众号(quwjcom)获取更多新鲜资讯和好玩的创意!每天都有新姿势哦!
新款树莓派主板,板载无线网卡、蓝牙。更有优品精选套件,开箱即用!
菲尔宾 (Carrie Anne Philbin)著,方可(树莓派实验室)译
关注我们的微信公众号(quwjcom)获取更多新鲜资讯和好玩的创意!每天都有新姿势哦!
实验室QQ群:
投稿与分享内容
欢迎你通过邮件向本站推荐优质的内容或投递原创稿件,你的优质内容将会为更多树莓派玩家提供创造的核燃料!环境:树莓派,系统raspbian,系统自带两个版本的python以及pygame。
程序如下:
1 !/home/pi/game_1.py
2 import pygame
4 width = 640
5 height = 480
6 radius = 100
7 fill = 1
9 pygame.init()
#初始化pygame
11 window = pygame.display.set_mode((window, height))
12 window.fill(pygame.Color(255, 255, 255))
# 用白色填充画板
13 while True:
pygame.draw.circle(window, pygame.Color(255, 0, 0),
(width / 2, height / 2), radius, fill)
# 红色画圆
pygame.display.update()
# 更新图像
输入命令:python game_1.py
运行程序,结果如下:
键盘输入:ctrl + c
终止程序。
然而,由于树莓派图形界面的卡爆,返回到命令窗口再ctrl + c有时候会卡掉,不如直接在pygame窗口上操作来的爽快,其实pygame窗口就是用gui编程的,类似于tkinter模块做成的gui,那么关掉窗口就需要事件输入反应,在原来的game_1.py文件后面加入代码:
1 while True:
if pygame.QUIT in [e.type for e in pygame.event.get()]:
我发现树莓派连接网络这方面真是慢,插上电源启动网络若干分钟才能SSH连接到树莓派ip,至于访问外网,时有时无,有时候由于某种故障,例如长时间不动树莓派或者重启wifi就会导致网络连接失败,putty成为inactive,这个时候只有重新拔插电源才能正常,否则直接SSH会显示time out,只能说没有HDMI线就是麻烦,一重启网络或者重启电脑就会出错。
2、Surface
Surface可想象成一个矩形的图像,可以由多个图像帧组成,用于实现游戏或动画中一个场景,接下来要做的就是合并两张图片。
tips:由于这里需要图片,因此在购买了HDMI转换器后,使用网络还是很方便的,首先方便传图,下载了scrot,下载后直接在命令行输入:scrot即可截取当前屏幕图片,也可以通过输入:scrot -h命令查看帮助文档,比如选择截图范围就可以输入:scrot -s就可以截取想要的图片范围了,保存的图片放在当前路径下,可以使用pi里面自带的picture viewer查看图片。
程序如下:
1 import pygame
3 pygame.init()
4 #设置黑色背景surface大小
5 screen = pygame.display.set_mode((450,450))
6 #加载第一张图片,并将其转换为与当前模式相匹配的模式
7 background = pygame.image.load("banboo.jpg").convert_alpha()
8 theremin = pygame.image.load("panda.jpg").convert_alpha()
9 #将第一张图片与surface合并,并通过参数设置图片合并的位置
10 screen.blit(background, (0,0))
11 screen.blit(theremin, (135, 150))
12 while True:
pygame.display.update()
结果显示如下:
分析:由上图可以看出,大熊猫并没有被完全显示,因为大熊猫&panda.jpg&这个图片的分辨率大于竹子&banboo.jpg&这个图片,因此才不能显示完整的熊猫图片,因此可以尝试调节大熊猫的像素来适应竹子的像素。
3、在Surface上绘图
如果要绘制一段文字,就需要加载字体,需要用到font模块来加载字体文件并渲染文本。可以先通过pygame.font.get_fonts()函数可以获取pi上的字体列表:
1 import pygame
3 pygame.init()
4 for fontname in pygame.font.get_fonts():
print fontname
输出结果如下图:
下面将使用代码加载freemono这个字体来渲染文本:
1 import pygame
3 pygame.init()
= pygame.display.set_mode((725, 92))
5 #设置字体类型为&freemono&,大小为72号
6 font = pygame.font.SysFont("freemono", 72, bold = 1)
7 textSurface = font.render("I love my pi!", 1,
pygame.Color(255, 255, 255))
9 screen.blit(textSurface, (10, 10))
10 while True:
pygame.display.update()
输出结果如下:
&4、处理事件与输入
在pygame中,用户触发的事件会被捕获并以Event的对象形式放入消息队列,而pygame.event模块提供从消息队列中获取未被处理的事件对象并能够对事件进行进一步的处理。接下来将会扩展pygame_1程序来通过捕捉鼠标事件来绘制不同的圆形,原理是越靠近窗口边缘,圆的半径越大。
程序如下图所示:&&
结果图很漂亮:
5、播放声音
tips:这里,树莓派屏幕右上方出现一个彩色方块的原因时供电不足,建议截usb插口的话,用供电的多接口usb,因为严重供电不足,否则的话播放音乐插耳机的时候各种故障,然后系统崩溃,树莓派发热发烫。
5.1在命令行中输入以下命令打开工具界面:
sudo raspi-config
5.2选择Advanced-option回车后,选择Audio再回车
5.3由于默认的声音输出口试HDMI输出,如果你的HDMI连接的显示屏是没有声音播放口的话建议转为模拟信号输出,也就是耳机输出,选择Forced audio即可
好的,现在你可以百度一个在线音乐,在耳机插孔插上耳机就可以听到音乐了。
6、播放视频
为了不让我的树莓派早夭,我决定去拿供电usb,果然那可恶的小方块不见了,但是不稳定,用电多的时候,还是会随着电源的红色信号灯一闪一闪,小方块也会一闪一闪,可能是供电的电源仍然不够,或者是因为我插上的东西太多了,或许无线鼠标和键盘会比较好。;
pygame.movie模块可以播放视频,前提是视频必须是MPEG1格式的,也就是类似于&.mpg&结尾的视频。当然可以通过安装ffmpeg将其他格式的视频转换为mpg格式。
代码如下:
1 import pygame
2 from time import sleep
4 pygame.init()
6 screen = pygame.display.set_mode((320, 240))
7 movie = pygame.movie.Movie("foo.mpg")
8 movie.play()
9 while True:
if not(movie.get_play):
print("rewind")
movie.rewind()
movie.play()
if pygame.QUIT in [event.type for event in pygame.event.get()]:
温馨提示:在pygame.examples模块中有很多完整的实例程序,可以在/usr/share/pyshared/pygame/exalmpes目录中找到源代码。
阅读(...) 评论()}

我要回帖

更多关于 树莓派 python 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信