构建你自己的 Raspberry Pi 相机

作者:Shawn Powers

在过去的几年里,我的 BirdCam 设置已经有了显著的发展。正如我在本期 UpFront 栏目中提到的,我希望在某个时候将视频流传输到 YouTube Live 直播,这样我就可以在电视上观看鸟类节目了。虽然观看鸟类是最终目标,但我一直在努力提高我的设备的质量和灵活性。

目前,“最佳”质量的视频来自罗技 720p 摄像头,这些摄像头通过 USB 连接到我的运动服务器。(您可以在之前的文章中查看设置——只需在 LJ.com 上搜索“birdcam”,您会找到大量信息。)我购买了几台 IP 摄像头,但每台都有其局限性和令人沮丧的地方。首先,IP 视频摄像头的质量不如本地设备的照片清晰——至少在不花费数千美元购买 Axis 的高质量 IP 摄像头的情况下是这样。我认为肯定有一种更简单的方法,随着 Raspberry Pi 3 时代的到来,我想我找到了。

为什么要选择 Pi?

RPi3 内置了 Wi-Fi。这意味着我可以访问它而无需担心以太网布线。而且,这意味着我可以潜在地将其放在室外,而无需尝试为网线做防风雨处理,也不用考虑如何在房子上打孔将以太网线拉进来!

RPi3 有一个令人难以置信的摄像头模块。就在我购买了 5 兆像素摄像头模块的第二天,RPi 发布了一款 8 兆像素摄像头,这意味着如果您现在购买,您将获得更好的效果。

RPi3 很小巧。这很重要,因为我计划将所有东西都放在一个防风雨的项目盒中,并将其安装在室外,靠近一个不在我窗外的喂鸟器(现在所有的喂鸟器都必须放在窗外)。

RPi3 相当便宜,尤其是与图像质量相似的 IP 摄像头相比。 RPi3 本身大约 35 美元,摄像头 25 美元,我手头还有一堆 MicroSD 卡和 MicroUSB 充电器。即使加上项目盒的成本(约 15 美元),总共也不到 80 美元。

目标

由于我将要设置的 Raspberry Pi 设备是一台功能齐全的 Linux 计算机,因此配置选项是无穷无尽的。可以在这个小家伙上安装 Motion,并在 RPi 上完全处理运动检测。不过,我已经在我自己的 Birdcam 服务器上安装了 Motion,所以我想要的是 Raspberry Pi 简单地输出一个视频流,以便我现有的服务器可以使用它来像处理本地连接的 USB 摄像头一样捕获运动。

我第一次尝试创建完美的 RPi IP 摄像头 (RPIPCam?) 包括编译 mjpg_streamer 并创建一个 MJPEG 流媒体摄像头,该摄像头可以添加到我的 BirdCam 服务器上的 Motion 设置中。事后我意识到,Motion 同样可以很好地使用 RPi 上的一个简单 Web 服务器来提供静态图像,然后不断地重新下载该图像。这意味着我的 Raspbian Linux 镜像根本不需要安装任何自定义软件,这非常理想。

过程

第一步是安装 Raspbian。这很容易完成,只需从 这里 获取 NOOBS zip 文件,然后将其解压缩到您新格式化的 MicroSD 卡上。不要被这个侮辱性的名字所迷惑;NOOBS 非常出色。它允许您安装各种发行版,并且完成了所有的繁重工作。我强烈推荐它。

将文件解压缩到您的 MicroSD 卡后,通过带状电缆连接 RPi 摄像头模块、HDMI 显示器、USB 鼠标和 USB 键盘。也可以在没有所有这些的情况下进行安装,但是在使用键盘/鼠标/显示器安装时会更好。您以后不需要它们,但首先,为了省去很多麻烦,请像设置台式机一样设置它。

在设置过程中,系统会询问您要安装哪个操作系统。暂时不要设置网络,因为虽然工作网络允许您安装其他操作系统(例如出色的 OpenELEC),但它不会保存您的 Wi-Fi 设置,您仍然需要重新设置。Raspbian 将是唯一的选项,这正是您想要的。

Raspbian 安装完成后,您将重启系统,它应该会进入 GUI 桌面。值得庆幸的是,如果您现在使用 GUI 工具设置 Wi-Fi,它将为您保存配置,即使您关闭 GUI 后也会自动连接。当您仍在 GUI 中时,打开一个终端窗口并找出您的 MAC 地址,以便您可以配置 DHCP 以每次都为 RPi 提供相同的地址。至少,输入 ifconfig 并查看您的 IP 地址是什么,以便您稍后可以通过网络连接到设备。

当您知道您的网络信息后,输入 sudo raspi-config 以启动 Raspbian 配置工具。在文本菜单系统中,您需要执行四件事

  • 启用摄像头。这是一个菜单选项。您只需在菜单中选择“启用”,就应该可以了。

  • 更改“pi”用户的密码。

  • 在“启动选项”菜单中,选择需要登录的控制台选项。

  • 在“高级选项”中,确保 SSH 服务器已启用。

完成后,输入 sudo reboot 并等待 RPi 重新启动。确保 GUI 没有启动,并确保您可以从另一台计算机 ssh 连接到 RPi。一旦您确定它工作正常,您就可以断开显示器、键盘和鼠标。

安装后设置

除了默认安装的软件外,我在 RPi 上安装的唯一软件是 lighttpd 软件包。它是一个非常快速、简单的 Web 服务器。由于我只需要通过 HTTP 提供图像,因此它非常完美。所以,如果您正在按照步骤操作,请 ssh 连接到 Raspberry Pi 并输入


sudo apt-get update
sudo apt-get install lighttpd

下一步是开始拍摄照片并提供它们,但在执行此操作之前,请检查以确保摄像头模块正在工作。在终端上,输入


vcgencmd get_camera

您应该看到类似这样的内容


supported=1 detected=1

如果不是,请再次运行 raspi-config 并确保摄像头模块已启用。您可能需要重启。它应该可以开箱即用,无需任何额外的软件。我花了很长时间试图排除一个无法工作的摄像头的故障,结果发现这是一个坏摄像头。在正确安装了工作单元后,带状电缆也插紧了,摄像头立即开始工作。仔细检查连接,但如果看起来已连接但就是无法工作,则可能是您的摄像头坏了。我怀疑坏摄像头并不常见,但由于我购买了两个摄像头,其中一个坏了,我的记录显示它们的故障率为 50%。(永远不要使用小样本量进行统计!)

一旦摄像头报告它正在工作,您就可以开始拍照了。内置程序实际上是执行此操作的最佳(可能也是唯一)方法。运行 raspistill 命令,使其每 100 毫秒拍摄一张新照片,每次都覆盖之前的照片。这是命令


raspistill --nopreview -w 1280 -h 720 -q 80 -o /dev/shm/pic.jpg
 ↪-tl 100 -t 0 -th none

以下是这些标志的作用

  • --nopreview:您没有使用 GUI,因此尝试生成预览图像以在显示器上查看毫无意义。

  • -w:快照的宽度,以像素为单位。

  • -h:快照的高度,以像素为单位(摄像头可以做到比 720p 更高的分辨率,但这是我 BirdCam 想要的大小)。

  • -q:质量 0–100;数字越大,质量越高,但文件大小也越大。进行实验并找到您满意的折衷方案。请记住 Wi-Fi 速度的限制。

  • -o:保存文件的位置。由于您希望它覆盖,这是一个静态位置。我总是将其放在 /dev/shm/ 中,因为那是机器上的内存盘,并且它不会因持续写入而磨损 SD 卡。

  • -tl:快照之间的时间。我将其设置为 100 毫秒,以便“视频”的结果约为 10fps。您可能需要根据分辨率和质量降低速度。只需观察输出是否丢帧即可。

  • -t:在停止捕获之前保持捕获多长时间。默认值为 5 秒,这没有任何好处。将其设置为 0 似乎使其永不超时。

  • -th:缩略图图像的大小和质量设置。您不需要这里的缩略图,因此“none”只是确保不创建任何缩略图。

要进行的唯一其他配置是链接图像文件,以便可以通过 HTTP 远程查看它。由于您之前安装了 lighttpd,只需输入


sudo ln -s /dev/shm/pic.jpg /var/www/html/pic.jpg

然后通过打开浏览器窗口并访问 http://raspberry.pi.ip.address/pic.jpg 来查看它是否工作,您应该会看到一张静态图像。如果您刷新浏览器,您应该会看到一张新图像。稍微移动一下摄像头,以确保当您单击刷新时,您看到的是一张新图像。请注意,图像尚不会在您的浏览器中自动刷新,但如果您手动刷新,您应该会看到更新后的图像。

如果它按预期工作,请返回 SSH 终端并按 ^C 停止 raspistill 进程。如果您希望它自动启动,我建议输入 crontab -e,然后在 crontab 文件中添加如下条目


@reboot raspistill --nopreview -w 1280 -h 720 -q 80 -o
 ↪/dev/shm/pic.jpg -tl 100 -t 0 -th none > /dev/null 2>&1

这将使进程在启动时启动,并将所有输出发送到 /dev/null,这样您就不会收到来自 cron 守护程序的持续电子邮件消息。

模型

我喜欢模型。事实上,在我大约一半的项目中,我从来没有真正超越模型阶段。坦率地说,我只是没有耐心,想快速地让一些东西工作起来!所以我的 RPi IP 摄像头的第一个实现看起来像图 1。我将盒子靠在我的办公室窗户上,并能够获得相当不错的图像(图 2)。请记住,图像甚至远未达到 RPi 摄像头可以管理的最大图像质量,而且它真的很棒。我遇到的一个挫败感是 RPi 摄像头模块具有“无限对焦”,因此无法针对微距拍摄进行调整。如果您查看图 3,您会看到差异。那是我的罗技 USB 摄像头,它支持手动对焦。我更喜欢具有模糊背景的清晰图像。不过,两者的图像质量都非常高。而且,由于 1280x720 对于 RPi 摄像头来说是相当低的分辨率,所以我非常满意。

图 1. 我的“模型”通常应该被嘲笑。

图 2. 这是通过 Raspberry Pi 摄像头记录的蜂鸟喂食器。

图 3. 这是通过罗技 USB 网络摄像头记录的蜂鸟喂食器。

与 BirdCam 集成

请记住,由于 Raspberry Pi 是一台完整的计算机,因此您无需在另一个系统上实现 Motion。在我的情况下,Motion 安装在另一台计算机上,但您的不一定非得这样。

我不会深入介绍 Motion 本身的设置过程,因为这在我过去的 BirdCam 文章中已经深入介绍过了。但是,我将向您展示为刚创建的新摄像头配置新的 thread.conf 文件是多么简单。在 /etc/motion/ 中,我创建了一个新文件 thread4.conf,我将其包含在主 /etc/motion/motion.conf 文件中。这是 thread4.conf 的样子


framerate 10
output_normal on
quality 80

webcam_port 8084
webcam_quality 75
webcam_maxrate 10
webcam_localhost off
webcam_maxrate
webcam_limit 0

netcam_url http://rpi.ip.address/pic.jpg
netcam_tolerant_check on

您可以使用 Motion 配置很多其他内容,例如捕获运动、电影等等。但是,这个简单的配置文件将 RPi 提供的简单 .jpg 文件转换为 MJPEG 流,可以在端口 8084 上查看。因此,如果您加载 http://birdcam.ip.address:8084,您将看到一个全动态 MJPEG 视频流!

最后润色

我的下一步是将 RPi IP 摄像头放入我的防风雨项目盒中。我已经有了盒子(图 4),并计划为我的最终产品执行以下操作

  • 在塑料盒子上切一个孔,让摄像头可以看穿,然后用旧相框上的一块玻璃覆盖孔。我将使用硅胶密封剂来确保孔是防水的,并且我将用双面胶带或可能的热熔胶安装摄像头。我还将遮盖摄像头上鲜红色的 LED,以避免眩光。

  • 尝试将廉价老花镜的镜片安装在摄像头上。我想将 RPi IP 摄像头安装在非常靠近喂鸟器的地方,因此我可能需要使用老花镜片来为摄像头制作一个低技术含量的微距镜头。

  • 将 MicroUSB 变压器固定在项目盒内,以便在冬季,变压器的热量可以防止 RPi 冻结。我不确定摄像头单元的工作温度,但变压器应该足以保持盒子温暖。

  • 钻孔并密封一个位置,让延长线从项目盒中伸出。我希望它是气密的,因此需要更多的硅胶密封剂。

图 4. 项目盒在亚马逊上售价 15 美元,并且有足够的空间容纳所有东西。

未来?

老实说,我真的很想让摄像头实现太阳能供电。我可以将太阳能电池板安装在喂鸟器的屋顶上,然后用它为锂离子电池供电,以运行 RPi。最大的问题是 Raspberry Pi 计算机往往对电压变化非常敏感,并且容易重启。我担心充电/供电电路目前超出了我的知识范围。我理想情况下希望获得一块足够强大的太阳能电池,可以为电池充电,使 RPi 整夜运行。但是,那是另一天的项目了!

如果您做了任何受我的 BirdCam 启发或与之类似的有趣项目,我很乐意听到它们。同时,请关注 我的 BirdCam,因为我计划进行大量增强。

Shawn 是 Linux Journal 的副编辑,并且从一开始就接触 Linux。他对开源充满热情,并且热爱教学。他还喝太多咖啡,这经常在他的写作中体现出来。

加载 Disqus 评论