基于Robopeak触摸屏和官方摄像头的树莓派照相机

基于Robopeak触摸屏和官方摄像头的树莓派照相机

摘要:

    树莓派是开源硬件的里程碑,无数开发者们在树莓派平台上完成了他们的创意作品。如果搭载上嵌入式linux系统就可以组成一个微型的卡片计算机。今天我们来制作一个基于树莓派平台的触摸屏照相机,它并不是设计精美的产品,但它有着开源的可定制性。这个项目使用RobopeakTFT触摸屏和树莓派摄像头模块来制作一个一按即拍的数码相机。你也可以选择性的加入WiFi来自动的把拍摄的照片传到另一台电脑上以供编辑。它不是要代替你的数码相机(甚至是手机的摄像头)。它只是一个简单的学习锻炼的产物而不是精美的消费品。但因为它是开源的,你可以给它定制一些普通相机做不到的功能。 

关键字:触摸屏 摄像头 树莓派 

 

1、Robopeakmini USB触摸屏的安装

    RoboPeakUSB显示器是由RoboPeak团队开发的一款以USB接口作为传输协议的触摸屏显示器。RoboPeakUSB 显示器可以与各种不同的设备和平台进行连接,进而成为它们的人机接口。我们提供全面的产品资料和手册,让你无障碍使用这一便捷的产品。Robopeak团队开源产品的设计和源码,方便你的二次开发。所有资料将会在官网首发更新,欢迎关注Robopeak和DFRobot官网。 

1.1、Robopeakmini USB触摸屏概述

   随着低成本,高性能的ARM处理器的普及,催生了一大批以树莓派为代表的Mini PC,它们通常使用 HDMI 接口与电视或者显示器连接,再配合 USB 接口的键盘与鼠标成为一台Mini PC。可是这样的组合让Mini PC失去了便携性,必须带上鼠标、键盘,且在有电视(带有HDMI接口的显示器)的地方才能使用。 利用RoboPeakUSB 显示器可以让Mini PC成为真正的Mini PC,只要有电源的地方,就可以使用。


基于Robopeak触摸屏和官方摄像头的树莓派照相机_第1张图片

图1、MK802连接RoboPeakMini USB显示器 

   在PC上,有一块小型的触摸屏可以大大改善PC的使用体验,为有创意的应用提供了更多的可能。以 Razor 推出的灵刃系列笔记本电脑为例,其键盘旁集成的触摸屏可以成为游戏中技能的释放面板;对于一些专业软件,也可以成为常用功能的快速入口。


基于Robopeak触摸屏和官方摄像头的树莓派照相机_第2张图片

图2、Razor Blade笔记本电脑的触控液晶屏

   此外对于一些没有显示器的设备,如服务器、NAS 等设备,触摸屏可以作为人机接口,显示设备的状态,提供设备的管理功能,可以大大的提高设备的用户体验,提高管理效率。

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第3张图片

图3、PC与RoboPeak Mini USB显示器进行连接

1.2、Robopeak mini USB触摸屏的安装

   RoboPeakMini USB显示器在设计之初就充分的考虑到了与Mini PC连接工作的使用场景与Mini PC连接使用也是最方便的使用方式之一。

您可以选择2种简单的方式使用RoboPeakMini USB 显示器

.使用RoboPeak提供的预编译Mini PC固件

.使用RoboPeakMini USB显示器驱动程序中的ARM Suite工具集安装预编译驱动

    为了方便大家使用,RoboPeak提供了预先编译并打包好的Mini PC固件供大家使用。您只需将预先编译固件镜像简单的写入SD卡或者Mini PC自带的NAND存储芯片中,即可使用USB显示器,无需任何额外配置。


    您可以从如下地址下载与您的设备对应的预编译固件

http://www.robopeak.com/docs/doku.php?id=product-rpusbdisp-downloads


步骤1下载并安装Win32 Disk Imager工具

Win32Disk Imager是一款开源的Windows磁盘映像工具您可以下载该工具

http://sourceforge.net/projects/win32diskimager/

步骤2打开Win32 Disk Imager工具

Win32 DiskImager并没有安装程序,解压缩后即可使用。请双击Win32Disklmagerexe可执行文件打开该工具。

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第4张图片

图4 Win32 Disk Imager主界面

    请利用ImageFile框中右边的打开文件按钮选择映像文件(*.img文件),并在Device一栏中选择您的SD卡。此时,Write按钮会从灰色不可用变成可用,请单击Write按钮。Win32Disk Imager会弹出如下对话框让您确认.

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第5张图片

图5 Win32 Disk Imager确认界面

    请单击Ye:按钮执行写入操作。Win32Disk Imager将会把映像文件中的内容写入您的SD卡中。根据您的SD卡的写入速度的不同这个过程可能会耗费较长的时间。请务必耐心的等待写入过程全部完成,否则可能造成数据不完整,无法正常使用SD卡启动您的Mini PC。

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第6张图片

图6 Win32 Disk Imager正在写入映像

    至此,树莓派的屏幕的过程全部结果,而且顺便也预装了树莓派的系统,为了确保所有相互依赖的软件正常工作,最简单的方法是从一个干净的系统开始。 格式化4GB或者更大容量的SD卡(也可以用带转接卡的microSD)并且写入2013-09-25版本的RaspbianWheezy操作系统,而不是之后的2013-12-20版本。虽然最新版本总是那么的诱人,但是TFT屏还不能在之后的版本上完全正常工作。修复工作正在进行中,这个问题可能会在后续的发布中得到解决。但是由于Robopeak触摸屏的限制,这里我们使用的是2013-09-10Wheezy Rasbian。

    使用2013-9-25和后面更新版本的树莓派系统时,触摸屏不能正常工作,而且Robopeak对后面版本的树莓派并没有很好的支持,在多次尝试之后选择了预编译好的MINI PC固件。


然后进行第一次启动配置。 以下选项是必须的:

ExpandFilesystem

EnableCamera

以下选项非常有用推荐设置:

在InternationalizationOptions更改Change Timezone和Change Keyboard Layout为与你相对应的区域。

以下配置是可选的:

在AdvancedOption,选择Hostname来为树莓派指定一个唯一的名字(比如”picam”)来与网络内的其他树莓派区别开。

在AdvancedOption,选择SSH来打开远程命令行访问(对日后的配置和查找问题很有帮助)。

 

不应该使用下列选项:

   Overclock.这是一个便携式,电池供电的项目并且超频更费电。超频的系统很有可能烧坏SD卡。不要打开这个选项。接着就触摸屏就能正常工作了。

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第7张图片

图7 装好编译好屏幕驱动的树莓派系统的启动画面


2 树莓派官方摄像头的安装 

2.1 摄像头简介

     树莓派相机模块可以用来拍摄高清视频,以及相片。初学者使用很简单,但是作为高级用户假如你想学习更多知识,我们也会提供更多的帮助。在网上有很多例子,你也可以使用库来操作相机。

    如果你在细节感兴趣,你会想要知道该模块有五百万像素定焦相机支持1080p30,720p60和vga90视频模式,以及捕捉照片。它将通过一个15cm带状电缆的CSI电缆RaspberryPi。它可以通过算法和V4L API访问,并有众多的第三方库建造它,包括picameraPython库。

      连接方式:90度垂直连接器,HDMI口旁边那个。连接时触点一侧朝向HDMI接口

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第8张图片

图8 树莓派官方摄像头连接示意图

软件使用:

1. RPi固件和raspi-config已经为了摄像头更新,请执行一次apt-getupdate; apt-get upgrade(更新需要先安装putty,或者用键盘连接树莓派在树莓派命令行更新)

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第9张图片

图9 执行一次apt-get update

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第10张图片

图10 执行一次apt-get upgrade

2. raspi-config中选择camera,启动RPi固件中的摄像头驱动,然后重启

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第11张图片

图11 启用摄像头模块

3. 使用命令行程序raspivid和raspistill操作摄像头,捕捉视频片段或图像

4. 捕捉到的视频片段需要用mplayer播放

 

      要实现在树莓派上面开发相机软件,还必须为树莓派相机安装Python库。


sudo apt-get install pip python-pip
sudo pip install picamera==0.8


   使用0.8版本非常重要,而不是更新的1.0版本。在新版本上我们使用的功能还有一点点不稳定。一旦状况改变,我们会发布一个修订版本修正这个问题,但是假如你是自己开发程序而不是使用现成的程序,那么还是可以考虑使用新一点的picamera库,关于该相机库的开发文档可以在下面的网站上找到,到目前为止,最新的库版本为1.5.

http://picamera.readthedocs.org/en/release-1.2/


3、软件开发平台的安装 

3.1、SSH安装

     SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(NetworkWorking Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有U NIX平台—包括HP-UX、Linux、AIX、Solaris、DigitalUNIX、Irix,以及其他平台,都可运行SSH。

    这个是平时用的最多的东西了,使用SSH可以免去:在电脑与树莓派间切换的麻烦,购买KVM转换器的费用,甚至可以直接免去为树莓派专门准备显示器,方便广大只有笔记本没有单独显示器的在校学生。

     事实上树莓派大多数的操作,都可以通过电脑的远程登录完成。通过VNC可以登录到树莓派的桌面环境,而通过SSH可以操作树莓派的命令行。

开启SSH

    事实上最新的Raspbian 2012-10-28已经默认启动了SSH支持,无需特意开启。

    如果因为各种原因,系统没开启SSH服务(从旧系统升级,曾经特意关掉等),可通过sudoraspi-config启用或禁止SSH。

登录SSH

     登录SSH的唯一推荐工具是PuTTY。(Tunnelier(Bitvise SSH Client)也是好工具,但无奈中文乱码无法解决而不建议)

 论坛提供PuTTY0.62中文汉化版下载:

 

        打开PuTTY,输入树莓派的IP地址即可登录,其中IP地址可以在局域网内部查询。

 首次登录会和您确认连接密钥,请按“是”确认。只有首次登录会出现这个提示。

 登录后会提示输入用户名和密码,输入之后即可登录树莓派的命令行。

 (提示:Raspbian默认的用户名密码是pi/raspberry)

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第12张图片

图12 Putty远程登录树莓派

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第13张图片

图13 修改Putty远程登录树莓派的界面字体

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第14张图片

图14 保存所有的设置以方便下次的使用

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第15张图片

图15 远程登录到树莓派操作

 

 

3.2 安装VNC实现远程可视化管理树莓派

      VNC(Virtual Network Computer)是虚拟网络计算机的缩写。VNC 是一款优秀的远程控制工具软件,由著名的AT&T 的欧洲研究实验室开发的。VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows和 MAC 中的任何远程控制软件媲美。 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和vncconnect。大多数情况下用户只需要其中的两个命令:vncserver 和vncviewer。


安装步骤:

一、首先,在树莓派上安装TightVNC 包,在putty里面或者树莓派终端输入


sudo apt-get update
sudo apt-get install tightvncserver


之后树莓派就会自动从网上下载vnc的服务器端,安装过程中会提示是否安装,按小写的y后回车,继续安装。安装完成后会让你设置一个VNC登陆的密码,输入密码后还会问你是否输入个只能观看不能操作的密码,一般选择n,也就是不设置。整个安装完成之后输入

二、之后对VNC进行配置。首先通过以下命令运行VNC


tightvncserver


之后会出现以下画面,要求设置VNC密码,这个密码是客户端连接时使用的。输入密码之后还可根据需要,再输入一个view-only的密码,使用这个密码只能查看桌面,但不能操作:

三、在远程计算机(即电脑)上访问

下载 VNC Viewer,官方下载地址:

http://www.tightvnc.com/download.php

下载Window版的VNC-Viewer,这里选择Windows 32位软件。

 基于Robopeak触摸屏和官方摄像头的树莓派照相机_第16张图片

图16 下载VNC

 

安装时可以通过自定义选项选择只安装TightVNC viewer。运行TightVNC Viewer,在RemoteHost中填入Raspberry Pi的IP地址,注意IP后需要加”:1″,应该是表示连接ID吧。之前我没加,就一直连接不上。

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第17张图片

图17 VNC远程登录树莓派界面

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第18张图片

图18 树莓派Linux系统桌面

 

4、基于触摸屏的树莓派相机软件开发

        该开发过程主要使用了python脚本的pygame模块来编写界面,使用picamera模块来实现摄影操作。

4.1python简介

     Python是一种面向对象、解释型计算机程序设计语言,由Guidovan Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写。


     与Scheme、Ruby、Perl、Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用。它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务。Python虚拟机本身几乎可以在所有的作业系统中运行。使用一些诸如py2exe、PyPy、PyInstaller之类的工具可以将Python源代码转换成可以脱离Python解释器运行的程序。


4.2pygame模块

      Pygame是 跨平台 Python模块,专为电子游戏设计。 包含图像、声音。pygame建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。

使用Pygame

      Pygame的初始化非常方便,首先调用pygame.init(),这个函数为所有导入的pygame模块进行初始化,如果初始化失败,不会引发任何的异常。

Pygame中用于显示的是一个叫Surface的东西,Surface可以理解成一个表面,就像画画的白纸一样,任何东西都可以在上面绘制。每个Surface都有它固定的分辨率(可以理解成白纸的大小,即宽和高)以及像素格式(pixelformat)。


调用pygame.Surface可以创建一个图像对象。起初Surface会被清空成全黑,唯一需要的参数是它的大小。其它还有几个默认的参数:

pygame.Surface((width,height), flags=0, depth=0, masks=None): return Surface

pygame.Surface((width,height), flags=0, Surface): return Surface

像素格式可以通过传入位深depth或者一张存在的Surface来决定,flags参数是表面的一组位或标志,可以传入以下参数的任意组合:

HWSURFACE,在显存中创建图像

SRCALPHA,像素格式有alpha值,即透明度


      Surface可以有许多额外的属性,像alpha层,关键色,源矩形裁剪等。这些功能主要影响Surface是如何粘贴到其它表面的。这里的粘贴不是一般意义上的粘贴,因为它不止是原图拷贝,有可能是进行像素的与运算、或运算等等,我们称这种操作为blit(位块传输),blit会尽可能使用硬件加速,如果实在不行,它们会使用具有很好优化手段的软件传输方法。


    在Pygame中支持三种类型的透明处理:关键色(colorkeys),表面alpha(surfacealphas),像素alpha(pixel alphas)。表面alpha能够和关键色混合使用,但是如果用了像素alpha,就不能和其它两种进行混合使用了。关键色使得某一种颜色成为透明,任何和这个颜色一样的像素将不会被绘制出来。表面alpha是一个单一的值,它决定了整张图片的透明度。这个值为255表示不透明,0则表示完全透明。


      像素alpha储存了所有像素的alpha值,也就是透明度。在表面上的像素访问是允许的,但是对于一个游戏来说,这个速度实在是太慢了(不是一般的慢啊…试过你就知道了)。像素的访问和修改可以通过get_at()和 set_at()函数,但是如果需要批量操作,这种方法是不可取的,实在要做,可以利用pygame.surfarray模块,它将Surface看做是很大的高维数组,操作起来相当快。任何函数如果要直接访问一个Surface的某个像素数据的话需要将这个Surface锁定,锁定和解锁可以调用lock()和unlock()方法。


       对Surface有一定了解之后,我们就可以来看display了,pygame.display是Pygame中用于屏幕显示的模块,一旦创建了一个display,你就可以把它当成是常规的Surface来使用了。Pygame在进行显示的时候是采用双缓冲机制的,其实它内部有两个Surface,每次要绘制时是在后备缓冲上进行绘制,当所有东西都绘制完毕后需要手动调用pygame.display.flip()函数,这个函数的作用就是将后备缓冲和前台缓冲进行一次交换,如此一来,先前绘制的东西也就自然而然得显示到屏幕上来了(也可以调用pygame.display.update(),它是对前一个翻页函数的优化,可以传入一些矩形,只在传入的矩形进行更新操作)。我们利用以下函数对屏幕的Surface进行初始化:


pygame.display.set_mode(resolution=(0,0),flags=0, depth=0) : return Surface

resolution表示需要创建的窗口的大小,即分辨率。flags表示一些位或标志,一般有以下几个:

pygame.FULLSCREEN    创建一个全屏的显示模式

pygame.DOUBLEBUF     建议和 HWSURFACE 或 OPENGL组合

pygame.HWSURFACE     全屏下硬件加速

pygame.OPENGL           创建一个opengl 的渲染显示模式

pygame.RESIZABLE      显示窗口大小可变

pygame.NOFRAME       显示窗口没有边框

depth则表示当前Surface的位深。

screen =pygame.display.set_mode(SCREENRECT.size, pygame.FULLSCREEN)


        我们可以采用以上语句创建一个用于全屏显示的Surface对象,并且返回给全局变量screen。接下来我们从文件中读取一张图片并且将它显示到屏幕上来,pygame.image模块是用于图像的传输的,它包含了一些读取和保存图片的函数,读取图片可以采用pygame.image.load。它的原型是:

pygame.image.load(filename)return Surface

    从文件中载入一个图像,传入的是文件名。Pygame将会自动决定图像的类型(gif 或者 bmp)并且从数据中创建一个新的Surface对象。返回的Surface对象将会包含和文件中的原图一样的颜色格式、关键色和alpha通道。你可以返回Surface.convert()来创建一个拷贝,它在屏幕上绘制的时候效率更高。

 

4.3picamera模块


这个包提供了一个Python接口为Python2.7(或以上),Python3.2(或以上)的RaspberryPi的相机模块,地址为

http://picamera.readthedocs.org/en/release-1.2/

该代码在BSD许可证下授权。包可以从PyPI上的项目主页下载。该源代码可以从GitHub上,也承载了bug跟踪系统来获得。可以阅读ReadTheDocs上的文档(里面包含安装,快速启动实例,以及大量的代码)。


基于Robopeak触摸屏和官方摄像头的树莓派照相机_第19张图片

图20 Picamera模块开发者文档

 

4.4 拍摄照片

      拍摄照片有两种方法,一种是使用终端命令行,另外是一种是调用picamera模块,下面将分别介绍。

方法一:使用终端命令行来拍摄照片:

   可以参考以下的开发者文档 http://bbs.ickey.cn/group-topic-id-5436.html ,目前提供了三个应用程序,分别为:raspistill、raspivid、raspistillyuv。其中raspistill 和 raspistillyuv 非常相似,并且都是用于捕捉图像,而raspivid 用于捕捉视频。

所有应用程序均基于命令行方式运行,通过 OpenMAX的 mmal API 进行编写。OpenMAX 的 mmal API 提供了更易使用的系统组件。注意,mmal 是一个由Broadcom 为 Videocore 4 系统定制的 API。


    应用程序使用了三个 OpenMAX(mmal)组件:camera(摄像)、preview(预览)、encoder(编码)。所有应用程序均使用了摄像组件,raspistill使用了图像编码组件,raspivid 使用了视频编码组件,raspistillyuv 没有使用编码组件,而是直接将 YUV 从摄像组件输出到文件。

预览显示为可选参数,但是可以用于全屏或输出到指定的显示器显示区域进行显示。如果预览被禁用,那么 null_silk组件将会对预览帧进行“吸收”。这是由于尽管不需要摄像头生成供显示所用的的预览帧,但是仍需要使用它们进行曝光计算和白平衡设置的缘故。

拍摄照片示例:

# 两秒钟(时间单位为毫秒)延迟后拍摄一张照片,并保存为image.jpg

raspistill-t 2000 -o image.jpg


图21 输入拍照指令

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第20张图片

图22 照片信息

拍摄视频示例:

# 使用默认设置录制一段 5 秒钟的视频片段(1080p30)

raspivid-t 5000 -o video.h264


图23 输入拍摄视频指令

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第21张图片

 

图24 视频信息

 

 

方法二:使用Python IDLE编写的程序来实现拍照功能

IDLE是开发python程序的基本IDE(集成开发环境),具备基本的IDE的功能,是非商业Python开发的不错的选择。当安装好python以后,IDLE就自动安装好了,不需要另外去找。同时,使用Eclipse这个强大的框架时IDLE也可以非常方便的调试Python程序。基本功能:语法加亮;段落缩进;基本文本编辑;TABLE键控制;调试程序。

 

Idle 总的来说是标准的 Python 发行版,甚至是由 Guidovan Rossum 亲自编写(至少最初的绝大部分)。您可在能运行 Python 和 TK 的任何环境下运行 Idle。打开 Idle 后出现一个增强的交互命令行解释器窗口(具有比基本的交互命令提示符更好的剪切-粘贴、回行等功能)。除此之外,还有一个针对 Python 的编辑器(无代码合并,但有语法标签高亮和代码自动完成功能)、类浏览器和调试器。菜单为 TK “剥离”式;也就是点击顶部任意下拉菜单的虚线将会将该菜单提升到它自己的永久窗口中去。特别是"Edit" 菜单,将其“靠”在桌面一角非常实用。Idle 的调试器提供断点、步进和变量监视功能;但并没有其内存地址和变量内容存数或进行同步和其他分析功能来得优秀

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第22张图片

图25 Python IDE

 

拍摄一张照片源代码:

 


#定义照片的名字
background_image_filename='image.jpg'
#导入pygame库
import pygame
#导入一些常用的函数和常量
from pygame.localsimport *
#向sys模块借一个exit函数用来退出程序
from sysimport exit
#导入树莓派相机模块
import picamera
#导入时间模块
import time
from timeimport sleep
 
#定义屏幕的长和宽常量
width=320
height=240
#拍摄一张照片,分辨率由width和height决定,名字为image.jpg
with picamera.PiCamera()as camera:
  camera.resolution=(width,height)
  camera.start_preview()
  time.sleep(2)
  camera.capture('image.jpg')
#初始化pygame,为使用硬件做准备
pygame.init()
#创建了一个窗口
screen =pygame.display.set_mode((width,height),0,32)
#设置窗口标题
pygame.display.set_caption("My Camera")
#加载并转换图像
background =pygame.image.load(background_image_filename).convert()
#相机主循环
while True:
#接收到退出事件后退出程序
 for event in pygame.event.get():
      ifevent.type == QUIT:
           exit()
  #将背景图画上去  
  screen.blit(background,(0,0))
  #刷新一下画面
  pygame.display.update()



基于Robopeak触摸屏和官方摄像头的树莓派照相机_第23张图片

图26 程序运行结果

 

 

5、完整的相机源程序 

由于和上面拍摄一张照片源代码很相似,就不做注释了。


background_image_filename='image1.jpg'
import pygame
from pygame.localsimport *
from sysimport exit
import picamera
import time
from timeimport sleep
width=320
height=240
with picamera.PiCamera()as camera:
  camera.resolution=(width,height)
  camera.start_preview()
  time.sleep(2)
  camera.capture('image1.jpg')
pygame.init()
screen =pygame.display.set_mode((width,height),0,32)
pygame.display.set_caption("My Camera")
background =pygame.image.load(background_image_filename).convert()
flag=0
count=1
while True:
 for event in pygame.event.get():
      ifevent.type == QUIT:
           exit()
      elifevent.type == MOUSEBUTTONDOWN:
         pressed_array=pygame.mouse.get_pressed()
         for index inrange(len(pressed_array)):
           ifpressed_array[index]:
              ifindex==0:
                flag=1
                count=count+1
               print('left')
             elifindex==1:
               print('mid')
             elifindex==2:
               print('right')
 if flag==1:
   with picamera.PiCamera() as camera:
      camera.resolution=(width,height)
      camera.start_preview()
      time.sleep(2)
      camera.capture("image%d.jpg" % count)
      background = pygame.image.load("image%d.jpg" % count).convert()
      flag=0
  screen.blit(background,(0,0))  
  pygame.display.update()
 




保存源代码为*.py,并运行该python脚本。运行的方法有两种,一种是用鼠标在树莓派上根据TFT屏幕运行脚本,第二种方法是用VNC在电脑端运行python脚本。

 

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第24张图片

图27 拍照过程

所拍到的照片响应的保存在源程序的根目录下面,我们这里储存的目录是/home/pi/yulin,因此在里面可以找到刚才所拍下的照片,如下图所示

基于Robopeak触摸屏和官方摄像头的树莓派照相机_第25张图片

图28 树莓派拍下的照片

连续拍摄的时候不会覆盖掉前面已经存在的照片,因此我们可以连续拍摄。


图29 连续拍摄

 

6 总结与展望

 

这一次的课程设计基本上算是完成了任务,只能拍摄320*240的照片,这是因为我们在确定课题的过程中没有考虑到现实实践的时候可能出现的困难,没有能正确的评估该设计,中期制作的时候也经常会发生被某一个很小的问题卡住很久的现象,还好后面能正确的跳出的陷阱,终于在课程设计的最后期限时勉强实现了基本的拍照功能,之所以没有实现那个很复杂的功能,这里面有好多原因,最主要的一个是我们一开始一直在使用别人写好的源程序,这样子的话一旦出现错误,便不知道错误出现在哪,一个庞大的系统有可能在原来的环境中没有问题,但是换了一个不一样的环境之后就会发生一些很严重的奔溃现象。因此一旦发生这种类型的错误,以后应该吸取教训,一步一步编写程序,有耐心的调试程序。

下一步的设计的话,可以逐步的增加一些拍视频的功能,或者拍摄高清照片的功能,这些功能其实都不难,因为一旦环境配置好了,一个连接所有硬件的HelloWorld程序能正常工作,对于一个嵌入式系统是很重要的,接下来的事情只不过是在这上面小小的修改一下。

增加完拍视频和高清照片的功能之后可以再美化一下界面,使得操作过程更加人性化,并且设置开机自启动相机程序,这样才算是真正实现一个基本的相机。

 

 

7 参考文献

 

1 . PIPad(树莓派+触摸屏+官方摄像头模块)变身7寸触摸屏相机(含样张)

 http://bbs.ickey.cn/group-topic-id-14600-sc-desc.html

2 PythonPicamera1.2库中文教程

 http://bbs.ickey.cn/group-topic-id-15418.html

3 树莓派摄像头模块应用程序文档翻译

 http://bbs.ickey.cn/group-topic-id-5436.html

4 DIY一个带WIFI的树莓派照相机

 http://www.geekfan.net/5618/

5 用Python和Pygame写游戏-从入门到精通

 http://eyehere.net/2011/python-pygame-novice-professional-1/

6  树莓派学习16: 安装VNC,远程管理RaspberryPi

 http://bbs.ickey.cn/group-topic-id-4492.html

7  Documentation for picamera

 http://picamera.readthedocs.org/en/release-1.5/

8 树莓派官网

 http://www.raspberrypi.org/

9 Robopeak mini usb触摸屏数据手册、用户手册

 http://www.robopeak.com/blog/?p=480

10 DIY WiFiRaspberry Pi Touchscreen Camera

 https://learn.adafruit.com/diy-wifi-raspberry-pi-touch-cam/overview

 


你可能感兴趣的:(Linux,触摸屏,嵌入式系统,开源硬件,树莓派,摄像头)