鸟瞰相机,第二轮

作者: Shawn Powers

在 2013 年 10 月刊中,我描述了用于创建我的“鸟类乌托邦监控站”(更常被称为鸟瞰相机)的硬件和软件。如果您最近访问过鸟瞰相机,而访问人数之多令人惊讶,您会注意到许多变化(图 1)。在本文中,我将描述升级、更改以及沿途的一些挑战。如果您喜欢像这样涉及 Linux 的有趣项目,请继续阅读并加入我对鸟类的痴迷!

图 1. 鸟瞰相机发生了很大变化。这里,最大的变化被突出显示。还有,看看那些鸟!

切片和裁剪

我想对鸟瞰相机做的第一个改变之一是稍微放大喂食器。是的,安装在窗户中的 Galaxy S2 手机提供的巨大照片很不错,但对于在电脑屏幕(或高清电视,稍后我会谈到)上显示,1920x1080 大小的快照确实是理想的。不幸的是,当我裁剪照片时,它会遗漏鸟浴盆。因为我今年冬天花钱买了一个加热的鸟浴盆,所以我不希望错过任何坦率的水景镜头。您可以在图 2 中看到我计划如何放大喂食器,然后将鸟浴盆重新定位到照片的剩余部分上。虽然花了一些试错,但执行此操作的代码非常简单。我使用了 ImageMagick 套件中的 convert 程序。可能可以将裁剪和重新定位包含在一个命令中,但我只是创建了一个临时文件,然后在稍后叠加了该临时文件


convert /dev/shm/original.jpg -crop 640x360+1800+1425 \
        /dev/shm/birdbath.jpg
convert /dev/shm/original.jpg -crop 1920x1080+220+130 \
        /dev/shm/birdbath.jpg -gravity southeast -composite \
        /dev/shm/final.jpg

图 2. 我的旧手机拍摄的照片分辨率非常高。我能够剪切出鸟浴盆的小照片,并将其很好地叠加起来,以获得喂食器的特写镜头。

在上面的代码片段中,我从原始相机照片中裁剪出小的鸟浴盆照片,并将其保存为 birdbath.jpg。然后,使用另一个 convert 命令,我将原始照片裁剪为我之前提到的 1080p 大小,并将鸟浴盆叠加到照片上,并带有 -composite 标志。在这个小例子中,我使用 -gravity 标志将鸟浴盆放在角落里。您可以使用 -geometry 标志更精确地定位,您将在我的最终脚本中看到(请参阅“资源”)。

时间和温度

最初的鸟瞰相机文章展示了如何在照片顶部添加时间戳,但我没有提到我是如何获得温度的。从那以后,我向注释中添加了日出和日落信息,并使其更易于阅读。(图 1 显示了左上角的注释。)

虽然叠加信息的方法并没有太大不同(您可以在最终脚本中查看 - 请参阅“资源”链接),但获取温度和日出/日落信息具有挑战性。为了获得当前温度,我使用了一个名为 weather-util 的小型命令行程序,它在大多数发行版存储库中都可用。该程序实际上提供了比所需更多的信息,因此要仅提取温度,您需要进行一些 grep-fu


weather-util -i KPLN | grep Temperature | awk '{print $2}'

这需要一些解释。您需要弄清楚您的四字母天气 ID 是什么。找到它的最佳地点是 http://weather.noaa.gov。找到离您最近的位置,然后在顶部的 URL 中查找四字母代码(通常是机场)。例如,佩尔斯顿地区机场离我最近,所以我的 ID 是 KPLN。如果您认为最好从我的后院获取实际温度,我同意。事实上,出于这个原因,我将在未来几个月内着手建立自己的气象站。

代码的其余部分执行两件事。 Grepping "Temperature" 返回包含温度的 weather-util 结果行,然后 awk 命令仅从该行中提取华氏温度。我设置了一个 cron 作业,每隔几分钟将温度保存到一个文本文件中,我使用该文件来注释鸟瞰相机照片。日出/日落信息与之类似,但为此,我使用了雅虎天气信息。您将需要您的 WOEID 信息,当您访问 http://weather.yahoo.com 并输入您的位置信息时,该信息再次在 URL 中可用。例如,我的天气 URL 是 http://weather.yahoo.com/united-states/michigan/indian-river-2426936,所以我的 WOEID 是 2426936。其余的都相当容易,使用更多的 grep-fu。这是日出的代码


echo `l=2426936;curl -s http://weather.yahooapis.com/
↪forecastrss?w=$l|grep astronomy| awk -F\" '{print $2}'`

以及日落的代码


echo `l=2426936;curl -s http://weather.yahooapis.com/
↪forecastrss?w=$l|grep astronomy| awk -F\" '{print $4}'`

与温度非常相似,我有一个 cron 作业将这些值存储到一个文本文件中,该文件在最终鸟瞰相机图形的注释期间使用。一旦我获得可以从中提取信息的本地气象站,我可能会添加风速等信息。就目前而言,我认为这是一个有用的信息。

窗口相机

如果您一直在关注我的博客或我的 Twitter feed,您可能已经看到了一些不同版本的窗口相机。我尝试对 USB 网络摄像头进行防风雨处理(图 3),它一直工作到风将雪吹进我用 Dixie 杯子制作的“罩子”里。很长一段时间,我将旧 iPhone 靠在窗户上,只是提取了一张照片嵌入到最终的鸟瞰相机照片中。 iPhone 的分辨率只有 640x480,因此使用 convert 嵌入该图像(直接从 iPhone 下载)非常简单。

图 3. 我的 Dixie 杯子防风雨处理做得还不错,直到雪花飞舞。现在它在里面,透过窗户看。

但当然,我想要更多。我目前的窗口摄像头是一个 Logitech C-920 USB 网络摄像头,连接到运行 Linux 的计算机。起初我将其连接到 Raspberry Pi,但 RPi 每秒最多只能处理五帧。我想要每秒 15 帧,全高清,所以我正在使用一台功能齐全的计算机。您看,我不仅想将窗口摄像头嵌入到鸟瞰相机中,而且还想拥有每天访问我的喂食器的鸟类的存档视频。

运动的魔力

我收到的关于我的原始鸟瞰相机文章的大部分反馈都包括“你为什么不使用 motion?”很简单,我附近没有可以连接相机的计算机。现在我有了。就像我之前提到的,我从 Raspberry Pi 开始。如果您有简单的需求或低分辨率相机,RPi 可能就足够了。由于无论您使用什么计算机,程序都相同,因此只需选择对您有意义的任何程序即可。

Motion 是一个令人沮丧地强大的程序。我的意思是它会做很多事情,通常很难知道从哪里开始。值得庆幸的是,默认配置文件的注释非常好,只需要进行少量调整即可使事情顺利进行。对于我的窗口相机,我让 motion 做三件事

  1. 每秒保存一张快照。这是为了鸟瞰相机,以便它可以将窗口相机的缩略图嵌入到角落中。(参见图 1,角落里有一只巨大的哀鸽。)

  2. 当检测到运动时,每秒保存全分辨率图像,15 帧。请注意,这有很多照片,尤其是对于繁忙的窗口相机。我每天很容易获得 100,000 张或更多的照片。

  3. 录制检测到运动的视频。我实际上不再这样做了,因为处理数百个短视频很困难。我只是拍摄在第二步中保存的照片,并创建一个每日存档视频(稍后会详细介绍)。

Motion 将做更多、更多的事情。它将支持多个摄像头。它可以处理 IP 摄像头。它可以在检测到运动时触发命令(打开灯光或警报,或向您发送短信等等)。但我会将这些事情留给鸟瞰相机 3.0!让我们配置 motion。

Motion:选择 USB 摄像头

您需要一个 UVC(USB 视频兼容)的摄像头。如果摄像头在包装盒上贴上漂亮的“USB 视频兼容!”标签就好了,但遗憾的是,它们永远不会这样做。好消息是,即使它们不吹嘘,许多摄像头也是兼容的。您可以 Google 搜索特定的摄像头型号,看看其他人是否使用过它,或者您可以在购买前查看在线数据库。请访问 http://www.ideasonboard.org/uvc 查看已知可工作的设备列表,但如果您要购买非品牌型号,您可能只需要尝试一下才能找到答案。有趣的是,如果您看到“Windows Vista 认证”标签,则摄像头是 UVC 兼容的,因为这是 Windows Vista 认证的要求。

我选择了 Logitech C920 USB 摄像头,它支持 1920x1080 (1080p) 视频,帧率为 30fps。默认情况下,摄像头会自动对焦,这听起来是个好主意。不幸的是,我发现摄像头几乎从不对焦在我想要的东西上,特别是当它非常靠近摄像头时,鸟类往往就是这种情况。如果您在自动对焦方面遇到问题,您可能需要尝试在命令行上调整摄像头。我将以下内容添加到我的启动脚本中以关闭自动对焦,并将手动对焦设置为刚好在我的窗户外


uvcdynctrl -s "Focus, Auto" 0
uvcdynctrl -s "Focus (absolute)" 25

您需要调整对焦值以使其恰到好处,但如果您的摄像头支持手动对焦,您应该能够对其进行调整以获得清晰的图像,而无需每次鸟类降落时都自动对焦。

Motion:配置 Config 文件

安装 motion 通常只是在您的存储库中找到它并安装即可。您可能必须编辑一个文件才能使其在启动时启动(例如 Ubuntu 中的 /etc/default/motion 文件),但这并不太痛苦。重要的是要了解关于默认配置的一些事项

  1. 通常,motion 默认使用的“根”文件夹位于 /tmp 文件夹中。如果您只是将其放在那里并让它运行,这可能会在您的系统上引起问题 - 它可能会填满您的 /tmp 分区并使您的系统崩溃。

  2. Motion 默认使用 /dev/video0。这很好,因为它很可能是您的 USB 摄像头的设备名称。但是,如果您有奇怪的摄像头,您可能需要更改设备设置。

  3. 当您更改配置文件时,您需要重新启动 motion 才能使其生效。这通常意味着运行 sudo service motion restart 或类似的命令。

接下来,打开配置文件(以 root 身份),并进行一些更改。我将在下面命名要搜索的指令,然后谈论一些设置。这些配置指令都应该在您的 /etc/motion/motion.conf 文件中。您只需要修改这些值

  • width:我的摄像头使用 width 1280。即使它支持 1080p,我实际上只以 720p (1280x720) 录制。它可以节省空间,并且仍然产生高清质量的内容。

  • height:为了获得正确的宽高比,我将其设置为 height 720。请注意,我的摄像头仅以 16x9 宽高比拍照,即使我将其设置为其他宽高比也是如此。

  • framerate:这是每秒捕获的帧数。我使用 framerate 15,这提供了相当流畅的运动,同时节省了最多的磁盘空间。使用 Raspberry Pi,在 CPU 负载达到最大值之前,我可以使用 640x480 摄像头获得大约 5fps。

  • threshold:这是在程序触发运动事件之前必须更改的像素数。我保留了默认值,然后在稍后进行了调整。我目前的设置为 threshold 2500

  • minimum_motion_frames:默认情况下,此项设置为 1。我发现偶尔的摄像头故障会触发运动事件,即使没有任何东西移动。将其设置为 2 或 3 将确保存在实际运动,而不是摄像头故障。我的设置为 minimum_motion_frames 2

  • quality:默认质量 75 可能还可以,但我真的想要清晰的图像,特别是考虑到我在摄像头上花费了将近 100 美元。我将其设置为 quality 95

  • ffmpeg_cap_new:此设置将告诉 motion 录制视频。我最初将其设置为“on”(默认为“off”),但最终得到了数百个小视频。如果您打开它,也要摆弄其他 ffmpeg 选项。

  • snapshot_interval:这将每 N 秒捕获一张图像。我将其设置为 snapshot_interval 1,并将该图像用于嵌入到鸟瞰相机中。

  • target_dir:此设置非常重要。此目录将是 motion 创建的所有文件的“根”目录。照片和视频文件都保存在此目录中,因此,虽然使用 ramdisk 听起来是个好主意,但它可能会很快被填满。

  • snapshot_filename:这将是定期快照文件名。我将其设置为单个文件名,以便不断覆盖它,但您可以将其保留为带有日期字符串的内容,以便它保留所有文件。此文件名相对于 target_dir,因此如果您尝试设置绝对路径,它仍然相对于 target_dir。但是,您可以添加目录名称。在我的系统上,target_dir 是 /home/birds,并且我在 /home/birds 中有一个名为 ram 的符号链接,它指向 /dev/shm ramdisk 中的一个文件夹。然后我设置 snapshot_filename ram/windowcam,它每秒覆盖我的 ramdisk 中的 windowcam.jpg 文件。这节省了我的硬盘驱动器的磨损。

  • jpeg_filename:此指令类似于 snapshot_filename,但相反,它是存储每秒 15 张图像的位置。您不想将此项重定向到 ramdisk,除非您有巨大的 ramdisk。我保留了用于命名文件的默认字符串。我的设置将照片放在一个单独的文件夹中,因此它看起来像这样:jpeg_filename photos/%Y-%m-%d_%H.%M.%S-%q

  • movie_filename:这决定了 ffmpeg 视频的名称和位置。我不再保存 ffmpeg 视频,所以我的设置无关紧要,但这是您分配文件夹和名称位置的地方。即使我的设置不再使用,但我记录视频时的设置是 movie_filename movies/%Y-%m-%d_%H.%M.%S

  • webcam_port:默认情况下,此项设置为 0,这意味着 Webcam 已禁用。在 Raspberry Pi 上,我不建议打开此项,但在我的基于 Intel i5 的系统上,我将其设置为端口 8081。它创建了一个实时 MJPEG 流,可以从浏览器或 IP 摄像头查看软件(例如来自 Android 平板电脑)查看。

  • webcam_maxrate:这决定了每秒帧数。我将其设置为 10,这足以看到运动,但不会给服务器带来负担。

  • webcam_localhost:默认情况下,此项设置为“on”,这意味着只有 localhost 可以查看 Webcam 流。如果您想远程查看它,即使是从 LAN 上的其他计算机查看,您也需要将其更改为“off”。

虽然这看起来有很多选项需要摆弄,但许多默认值对您来说就足够了。当您对设置感到满意后,键入 sudo service motion restart,服务器应该重新读取您的配置文件并开始执行您配置它执行的操作。

十万张照片?

我可能可以再写两三篇文章来谈谈我对我的鸟瞰相机服务器所做的有趣的事情。谁知道呢,也许我会再次访问这个话题。但在我结束本章之前,我想分享一件很酷的事情,我用它来存档给定日期的鸟类访问记录。我提到我最终每天从检测到的运动中获得超过 100,000 张照片,坦率地说,浏览这么多照片一点也不有趣。因此,在每天结束时,我使用捕获的图像创建一个 MP4 视频。我尝试了几种不同的工具,但最容易配置的是 mencoder。如果您安装了 mencoder(它应该在您的存储库中),您可以像这样将这些照片变成电影


mencoder "mf:///home/birds/photos/*.jpg" \
  -o /home/birds/archive/`date +"%Y-%m-%d"`-WindowCam.avi -fps 15 \
  -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vbitrate=7000

我每天晚上日落后从 cron 运行该命令。然后我删除图像,我就为第二天做好了准备。我最终得到的是一个每天 2-3 小时的视频,显示我窗户的所有鸟类访问记录。这可能看起来像一个蹩脚的视频,但我通常会在第二天早上快速浏览它,看看是否有任何新的或奇异的鸟类来访。这些视频每个 4-6GB,因此如果存储空间对您来说是一个问题,那么这是需要记住的事情 - 这将我带到下一个也是最后一个,鸟瞰相机的酷炫补充。

有史以来最无聊的 YouTube 频道

我希望能够从任何地方观看我的存档视频。可以通过 Plex 或类似的直接方式流式传输我的本地媒体,但这意味着我必须连接到我的家庭网络才能看到这些鸟。现在 YouTube 已经取消了 YouTube 帐户 10 或 15 分钟的限制,这意味着我可以将三个小时的鸟类在我的窗户的存档视频上传到 YouTube,并让他们在云中存储和显示我的视频 - 而且是免费的!

因为这是 Linux,我想找到一种方法来编写脚本来上传和命名我的每日视频。值得庆幸的是,有一个非常酷的程序叫做 ytu,它是 YouTube Uploader 的缩写。它很简单,但非常强大。从 http://tasvideos.org/YoutubeUploader.html 下载它。

运行 ytu 最困难的部分是您需要一个开发者密钥。您可以通过 https://code.google.com/apis/youtube/dashboard/gwt/index.html 成为开发者并获得开发者密钥。这并不困难,但 URL 不断变化,所以我无法给您更具体的链接。获得开发者密钥(一长串字母和数字)后,您可以填写 credentials.txt 文件,其中包含

  • Google 电子邮件地址。

  • 纯文本的 Google 密码。

  • 开发者密钥。

确保只有执行 ytu 二进制文件的帐户才能访问该文件,因为您的密码以纯文本形式存储。如果这个安全问题不可接受,您当然可以手动将视频上传到 YouTube。我实际上有一个单独的 Google 帐户用于上传鸟瞰相机视频,所以我不太担心安全性。

设置好凭据文件后,您可以从命令行调用 ytu,或者在我的情况下,从创建视频的同一个 cron 作业调用。视频创建完成后,我立即启动 ytu 以将其上传到 YouTube。经过几个小时的上传和处理,视频就可以观看了。如果您想观看我的存档视频,只需访问 http://snar.co/windowcam 并查看所有过去的视频。

不一定非得是鸟!

显然,我对观鸟有点痴迷。我们都有自己的怪癖。通过这篇文章和我的上一篇鸟瞰相机文章,希望您可以找到一种方法来调整 Linux 的强大功能,以满足您对视频捕捉的渴望。如果您最终得到了类似的东西,甚至是非常不同的东西(当地消防栓上的狗摄像头?),我很乐意听到!嗯,也许不是消防栓摄像头……即使对我来说,那也有点太奇怪了。

资源

鸟瞰相机:http://birds.brainofshawn.com

鸟瞰相机脚本:http://snar.co/birdcamscript

窗口相机存档频道:http://snar.co/windowcam

YTU 程序:http://tasvideos.org/YoutubeUploader.html

YouTube 开发者仪表板:https://code.google.com/apis/youtube/dashboard/gwt/index.html

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

加载 Disqus 评论