树莓派应用系列讲座
CICET©2014.6
使用 Python picamera 模块控制摄像头 本讲指导你设置树莓派的摄像头模块、使用 Python picamera 模块拍摄照片及视频、用 GPIO 针脚连接物理按钮且用于控制摄像头。 连接摄像头 1. 找到摄像头端口位置(靠近以太网端口旁边); 2. 提起端口顶部的压条; 3. 将摄像头的带状排线插入连接器(蓝色一面朝向以太网端口); 4. 用手按住排线的同时按下压条。 激活摄像头 1. 将 USB 电缆连接到电源; 2. 使用用户名 pi 和密码 raspberry 注册登录; 3. 在命令行提示符下键入 sudo raspi-config; 4. 从菜单上导航至 Enable Camera; 5. 选择 Enable; 6. 选择 Finish; 7. 选择 Yes 重新启动。 测试摄像头 1. 再次以用户名 pi 和密码 raspberry 注册登录; 2. 在命令行提示符下键入 raspistill -o image.jpg 3. 几秒钟后,你应该在屏幕上看到一个预览窗口,如何当捕获到图像是窗口会发生一点小变化。 摄像头编程:捕捉图像 首先安装 Python picamera 模块和 GPIO 库: sudo apt-get install python-picamera python3-picamera python-rpi.gpio 1. 在命令行下键入 startx,启动图像桌面环境; 2. 双击 LXTerminal 图标开始命令行,然后键入 sudo idle &启动 Python 环境; 3. 从菜单中选择 File > New Window,开启一个文本编辑器; 4. 键入下列代码(大小写是重要的!): import time import picamera with picamera.PiCamera() as camera: camera.start_preview() time.sleep(5) camera.capture('/home/pi/Desktop/image.jpg') camera.stop_preview()
5. 从菜单中选择 File > Save,并给你的脚本起一个名字,如 workshop.py; 6. 从菜单中选择 Run > Run Module(或按下 F5)运行该脚本。 1
树莓派应用系列讲座
CICET©2014.6
摄像头编程:激发时拍照 1. 如下图所示将树莓派连接到按钮上:
2. 在文本编辑器中,导入 RPi.GPIO 模块,设置 GPIO pin 17 并改变 sleep 行以使用 GPIO.wait_for_edge,如下: import time import picamera import RPi.GPIO as GPIO # new
GPIO.setmode(GPIO.BCM) # new GPIO.setup(17, GPIO.IN, GPIO.PUD_UP) # new
with picamera.PiCamera() as camera: camera.start_preview() GPIO.wait_for_edge(17, GPIO.FALLING) # new camera.capture('/home/pi/Desktop/image.jpg') camera.stop_preview()
3. 从桌面上删除 image.jpg; 4. 保存并运行你的脚本; 5. 一旦预览开始,按下连接到树莓派的按钮就可捕捉图像。 摄像头编程:倒计时捕获(自拍!) 1. 修改你的程序以保护按下按钮后延时等待: import time import picamera import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN, GPIO.PUD_UP)
2
树莓派应用系列讲座
CICET©2014.6
with picamera.PiCamera() as camera: camera.start_preview() GPIO.wait_for_edge(17, GPIO.FALLING) time.sleep(5) # new camera.capture('/home/pi/Desktop/image.jpg') camera.stop_preview()
2. 从桌面上删除 image.jpg; 3. 保存并运行你的脚本; 4. 按下按钮尝试一张自拍像。 摄像头编程:录像机 1. 修改你的程序,使之录制视频而不是拍照: import time import picamera import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN, GPIO.PUD_UP)
with picamera.PiCamera() as camera: camera.start_preview() GPIO.wait_for_edge(17, GPIO.FALLING) camera.start_recording('/home/pi/Desktop/video.h264') time.sleep(1) GPIO.wait_for_edge(17, GPIO.FALLING) camera.stop_recording() camera.stop_preview()
2. 保存并运行你的脚本; 3. 按下按钮开始录制视频,再按一次停止并退出程序。 摄像头编程:循环缓冲 1. 继续修改程序,使其连续录制到循环缓冲区,且当按下按钮时将缓冲写入磁盘: import io import time import picamera import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN, GPIO.PUD_UP)
with picamera.PiCamera() as camera: stream = picamera.PiCameraCircularIO(camera, seconds=20) camera.start_preview() camera.start_recording(stream, format='h264')
3
树莓派应用系列讲座
CICET©2014.6
GPIO.wait_for_edge(17, GPIO.FALLING) camera.stop_recording() camera.stop_preview() for frame in stream.frames: if frame.header: stream.seek(frame.position) break with io.open('/home/pi/Desktop/video.h264', 'wb') as output: while True: data = stream.read1() if not data: break output.write(data)
2. 从桌面上删除 video.h264; 3. 保存并运行你的脚本: 4. 按下按钮保存前 20 秒以上的视频到磁盘。 摄像头项目思想 上述工作看似简单,但通过不大的改变就可以形成很多有趣项目的基础。 延时摄影 通过在一个循环中运行基本捕获程序并调整延时的间隔,容易构造出延时序列。延时序列可以用 于将很多常规情况下不易看到的自然过程视觉化,如植物生长和衰败、长程建筑项目和气象循环 等等。以下是一些示例代码: import time import picamera
VIDEO_DAYS = 5 FRAMES_PER_HOUR = 1 FRAMES = FRAMES_PER_HOUR * 24 * VIDEO_DAYS
def capture_frame(frame): with picamera.PiCamera() as cam: time.sleep(2) cam.capture('/home/pi/Desktop/frame%03d.jpg' % frame)
# Capture the images for frame in range(FRAMES): # Note the time before the capture start = time.time() capture_frame(frame) # Wait for the next capture. Note that we take into # account the length of time it took to capture the # image when calculating the delay
4
树莓派应用系列讲座
CICET©2014.6
time.sleep( int(60 * 60 / FRAMES_PER_HOUR) - (time.time() - start) )
一旦图像捕捉完毕,你可以使用下列 FFMPEG 命令从这些图像中构造一个视频。先安装 ffmpeg: sudo apt-get install ffmpeg
然后运行: ffmpeg -y -f image2 -i /home/pi/Desktop/frame%03d.jpg -r 24 -vcodec libx264 -profile high -preset slow /home/pi/Desktop/timelapse.mp4
注意:在树莓派上运行以上的编码产生视频至少需要半个小时!你也许需要在一台快点的机器实 施这项操作。 单格动画 类似的方式,很容易用树莓派的摄像头构建一个单格动画系统。可以将“激发时拍照”程序在一 个循环中运行,当按钮按下时就可以持续捕获图像。然后,同样的 FFMPEG 命令可以用于构造 最终的视频。单格动画的主要挑战在于保持摄像头和目标场景足够静态。此处是一些示例代码: import picamera import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN, GPIO.PUD_UP)
with picamera.PiCamera() as camera: camera.start_preview() frame = 1 while True: GPIO.wait_for_edge(17, GPIO.FALLING) camera.capture('/home/pi/Desktop/frame%03d.jpg' % frame) frame += 1 camera.stop_preview()
一旦所有的帧捕捉完毕,使用 FFMPEG 命令可以将这些帧转换为视频: ffmpeg -y -f image2 -i /home/pi/Desktop/frame%03d.jpg -r 24 -vcodec libx264 -profile high -preset slow /home/pi/Desktop/stop_motion.mp4
5