带运动、夜间设置和网站的 Raspberry Pi 高清监控摄像头
创建白天和夜间清晰 720P 图片并拥有一个显示最近 10 张图片的网站的教程
引言
我目前正在开发此 PiCam sc 的更新版本,该版本将更易于安装,并为您提供接收更新和新功能的机会。 您可以在 GitHub 上找到此项目: https://github.com/dofl/PiCam
本文将向您展示如何将普通的 Raspberry Pi 摄像头(非 NoIR 版本)设置为高清监控摄像头的最佳设置。最终,您将获得一个清晰的 720P 图像,在夜间也能获得相当不错的质量,并且拥有一个显示最后 10 张图像的网页浏览器。
可选地,有一篇关于如何使用外部存储(如 NAS)来复制图像的教程。它使用内存文件系统 (TMPFS) 作为缓冲区,在慢速 Pi Wifi 将图像复制到 NAS 的同时存储图像。
背景
有许多关于如何将 Raspberry Pi 和摄像头实现为低成本监控摄像头的优秀教程。我以这些文章为基础,并尽量引用我仍然记得的来源。
由于其他人都已经描述了所有内容,我更感兴趣的是在使用普通摄像头(非 NoIR 版本)时获得最佳的图像清晰度和夜间设置质量。
入门
在深入研究之前,最好先阅读几行。我并不总是使用另一篇文章中的所有代码。
最好从我开始的地方开始。他也是让我使用 codeproject.com 的人,因为我不想设置另一个博客,而该博客会在几个月后再次宕机,因为我想将我的 Pi 用于另一个项目。:-)
Christoph Buenger 的《Raspberry Pi 作为低成本高清监控摄像头》。
要做的事情
- 购买他描述的硬件
- 安装 Raspbian
- 设置网络
不该做的事情(但可以随意实验!)
- 安装运动检测软件
- 阅读文章的其余部分,因为它基于其他运动检测/图像捕获软件
为什么?
我从未获得过我现在获得的图像清晰度和分辨率,我认为这是因为 Motion(软件包)。我宁愿使用 Raspberry Pi 基金会提供的原始软件,因为它占用的 CPU 更少,运动检测精度同样高,并且能生成非常清晰的照片。
外壳
题外话:我还买了一个假摄像头,但在看到 'PICE'(一个金属防水 Raspberry Pi 外壳)之前。
安装 picam.py
MakeTechEasier 的人也写了一篇文章,关于将 rPi 用作监控摄像头。
他们使用一个由社区成员编写的 Python 脚本,该脚本会不断拍摄小尺寸图像(在内存中),将其与前一张图像进行比较以检测更改的像素,当发现“足够多”的更改像素时,它会拍摄一张高分辨率图像。写得很好,配置很多,并且只使用 Rpi 提供的原始软件。
按照以下方式安装
sudo apt-get install python-imaging-tk
wget -c http://pastebin.com/raw.php?i=yH7JHz9w -O picam.py
chmod +x picam.py
脚本将使用一个名为 'picam' 的文件夹来存储所有图像。在启动脚本之前创建它。
mkdir ~/picam
在启动时启动 picam.py
脚本需要在启动时启动。当 Raspberry 在夜间和白天设置之间重启时,这将在以后需要。
wget http://pastebin.com/raw.php?i=AfqbjQrb -O picam_init
脚本需要移动到 init.d 文件夹才能启动。
sudo mv ~/picam_init /etc/init.d/picam
sudo chmod +x /etc/init.d/picam
告知系统 picam '服务'已到位
sudo update-rc.d picam defaults
通过网站查看最新图片
一段时间后,SD 卡会填满,这对于存档来说很好。但我还想通过浏览器查看最新图像。因此,我安装了轻量级 Web 服务器 Lighttpd 和 PHP。
sudo apt-get -y install lighttpd
sudo apt-get -y install php5-common php5-cgi php5
sudo lighty-enable-mod fastcgi-php
sudo service lighttpd force-reload
之后,您可以在http://ip-address-of-your-raspberry-pi 查看演示网站。
Lighttpd 安装在 /var/www/ 下。picam.py 脚本将其图像写入 /home/pi/picam/ 下。
我使用符号链接使 picam 的图像在 Web 服务器的目录中可用。
sudo ln -s /home/pi/picam /var/www/picam
这会在 /var/www/picam 中创建一个指向 /home/pi/picam 的“文件夹”(链接)。
我借用并改编了一段 PHP 代码,该代码显示了 picam/ 文件夹中的最后 6 张图像。
sudo nano /var/www/index.php
插入以下代码
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
print '<meta http-equiv="refresh" content="15">';
//get all images
$images = glob('picam/*.jpg', GLOB_BRACE); //formats to look for
$num_of_files = 10; //number of images to display
//stats
echo "Images: ". count($images). " | ";
$lastImage = new DateTime(date('Y-m-d h:i', filemtime(end($images))));
$firstImage = new DateTime(date('Y-m-d h:i', filemtime($images[0])));
$interval = $lastImage->diff($firstImage);
echo $interval->format('Timespan between first and last image: %a days, %h hours, %i minutes</br>');
krsort($images);
//show photos
foreach($images as $image)
{
$num_of_files--;
if($num_of_files > -1) //this made me laugh when I wrote it
echo "<b>".$image."</b> |
Created on ".date('D, d M y H:i:s', filemtime($image)) ."<br><img src="."'".$image."'"."><br><br>" ; //display images
else
break;
}
?>
现在您已经运行了一个非常简单的网站,该网站始终显示最后 6 张图像。它每 15 秒自动刷新一次。
可选:Web 服务器安全
如果您将摄像头网站公开到互联网,明智的做法是保护它。我们将通过用户名/密码保护 Lighttpd Web 服务器的 root 文件夹来实现这一点。
创建用户名/密码文件
sudo nano /etc/lighttpd/.htpasswd
在此文件中插入您的用户名:密码组合。仅此而已。
MyUsername:MyPassword
接下来,在 Lighttpd 配置文件中添加几行代码。
sudo nano /etc/lighttpd/lighttpd.conf
在 'server.modules = ' 中,添加以下行
"mod_auth"
将以下代码(例如)放在 'server.port = 80' 之后。
auth.backend = "plain"
auth.backend.plain.userfile = "/etc/lighttpd/.htpasswd"
auth.debug = 1
$HTTP["url"] == "/" {
auth.require = ( "" =>
(
"method" => "basic",
"realm" => "Authorization",
"require" => "valid-user"
) )
}
保存并通过键入以下命令重启 Lighttpd:
sudo service lighttpd restart
夜间照片的最佳设置
普通的监控摄像头都有某种红外线来照亮夜间的环境,以便拍出不错的照片。由于我也想在白天获得好照片,所以我决定使用普通摄像头并为摄像头使用更长的曝光时间。快速移动的物体会模糊,但在弱光条件下这是最好的。
首先,将摄像头安装到位。等待天黑,然后运行由raspberrypi-spy.co.uk编写的出色 Python 摄像头测试脚本。
cd ~
mkdir test_camera
cd test_camera
wget http://www.raspberrypi-spy.co.uk/archive/python/pi_camera_options.py
编辑 pi_camera_options.py 文件
nano pi_camera_options.py
进行设置,使其能够在所有不同情况下拍摄照片。
list_ex = ['off','auto','night','backlight','spotlight','fireworks']
list_awb = ['off','auto','sun','cloud','shade','tungsten','fluorescent','incandescent','flash','horizon']
之后,您可以运行它。它将在各种不同的摄像头设置下拍摄照片。您可以比较它们,看看哪张照片最符合您的目标。记住 'ex
' 和 'awb
' 设置在下一步中效果最好。
sudo python pi_camera_options.py
CRON:白天和黑夜设置之间的切换
我正在我的 rPi 上切换白天和黑夜设置。我想用夜晚的闪烁红灯吓跑窃贼,但又不想白天让邻居感到不安。同时,我想在夜间使用特定摄像头设置来拍摄照片,这些设置在上一阶段效果最好,并且曝光时间也更长。为了实现这一点,我创建了 2 个由 CRON 在设定时间运行的脚本。
首先,创建 CRON 将运行的 2 个脚本。一个用于白天,一个用于夜晚。
sudo nano /opt/picam_night.sh
插入以下代码
#! /bin/sh
sed -i 's/disable_camera_led=1/disable_camera_led=0/' /boot/config.txt
sed -i 's/cameraSettings = ""/cameraSettings = "-ex night -awb auto"/' /home/pi/picam.py
sed -i 's/-t 200/-t 500/' /home/pi/picam.py
sed -i 's/threshold = 30/threshold = 10/' /home/pi/picam.py
sed -i 's/sensitivity = 30/sensitivity = 20/' /home/pi/picam.py
/sbin/reboot
以及白天的那个
sudo nano /opt/picam_day.sh
#! /bin/sh
sed -i 's/disable_camera_led=0/disable_camera_led=1/' /boot/config.txt
sed -i 's/cameraSettings = "-ex night -awb auto"/cameraSettings = ""/' /home/pi/picam.py
sed -i 's/-t 500/-t 200/' /home/pi/picam.py
sed -i 's/threshold = 10/threshold = 30/' /home/pi/picam.py
sed -i 's/sensitivity = 20/sensitivity = 30/' /home/pi/picam.py
/sbin/reboot
SED 命令将在文件中查找特定的文本,并将其替换为另一段文本。这些行的作用是什么
- 在 rPi 启动序列中更改摄像头 LED。夜晚开启,白天关闭。
- 设置特定的夜间摄像头设置('
ex
' 和 'awb
' 设置)。 - 更改白天和黑夜摄像头的曝光时间。夜晚更长,白天更短。
- 夜间降低阈值(晚上拍摄照片的可能性更大)。
- 夜间降低灵敏度,同样是为了获得更多照片。如果 Pi 在夜间拍摄的照片过多,则提高此值,因为这是由于图像噪点造成的。
Raspberry Pi 将在更改这些设置后重启。这是更改摄像头上的闪烁 LED 所必需的。它由启动选项(/boot/config.txt)设置。
为了让它由 CRON 守护进程运行
sudo crontab -e
并在底部添加这两行
00 23 * * * sh /opt/picam_night.sh
00 06 * * * sh /opt/picam_day.sh
这将分别在晚上 23:00 和早上 06:00 运行“night”脚本和“day”脚本。
就这样。我将生成一些相当不错的图像,并在夜间使用特定的设置。
通过临时 RAM 缓冲区将图像传输到 WIFI 上的 NAS:TMPFS
我为 Raspberry PI 安装了一个 Edimax 的 WIFI 适配器。我在 eBay 上花了几个欧元买的。它很便宜,但它的范围和速度非常有限,尤其是在不在接入点的视线直线上时。
因此,我想将 Raspberry PI 的图像传输到我的 NAS。它 24/7 运行,我担心 Raspberry PI 中的 SD 卡很快就会损坏,如果每天写入 1000 张 300 KB(约 300 MB)的图像。
为了确保通过慢速 WIFI 网络复制图像不会干扰 picam 拍摄图像的速度,我将使用一个临时缓冲区将图像存储在内存中,使用TMPFS。
通过使用 TMPFS,picam 可以像它能够快速地将图像写入 TMPFS 文件系统一样快速地继续拍摄图像,而无需等待较慢的 WIFI 网络完成将图像复制到 NAS。复制图像到 NAS 的过程将由一个简单的 BASH 脚本处理。
方法
- 我们将设置到 NAS 共享的挂载。
- 将 10MB 的 TMPFS 文件系统设置为图像缓冲区。
- 创建一个 bash 脚本,该脚本会将 TMPFS 中的所有照片复制到 NAS,但是
仅当图像创建时间超过 5 秒时(以确保它不会复制在同一时刻由 raspistill 创建的图像)。 - 将 picam.py 脚本设置为正确的文件夹。
步骤 1 和 2:挂载您的 NAS 并创建 TMPFS 文件系统
创建将保存到 NAS 的挂载点和 TMPFS 文件系统的文件夹。
sudo mkdir /mnt/Name_Of_Your_NAS_Share
sudo mkdir /mnt/picam_tmpfs
在启动时挂载 NAS 共享和 TMPFS。这可以在 fstab 文件中完成。
sudo nano /etc/fstab
添加以下两行
第 1 行:下面的示例适用于可以以访客身份登录的 Samba / CIFS / 'Windows' 共享。
//IP.ADDRESS.OF.SERVER/SHARENAME /mnt/Name_Of_Your_NAS_Share cifs guest 0 01
第 2 行:这将在您刚刚创建的 /mnt/picam_tmpfs 文件夹中创建 10MB 的 tmpfs 文件系统。
tmpfs /mnt/picam_tmpfs tmpfs defaults,noatime,size=10M,mode=0777 0 0
noatime
参数会跳过设置文件的最后访问时间。这应该会给我们带来 I/O 性能的提升,尽管我很难想象我们会在内存文件系统上注意到它。
3. 创建将图像从 TMPFS 复制到 NAS 的 BASH 脚本
sudo nano /opt/tmpfsToNAS.sh
此脚本每两秒检查一次 TMPFS 文件夹(sleep 2),并移动 (-exec mv) 所有在至少 5 秒前创建 (-mmin +0.05) 的文件 (-type f)。插入以下代码:
#! /bin/sh
while :
do
find /mnt/picam_tmpfs -type f -mmin +0.05 -exec mv "{}" /mnt/Name_Of_Your_NAS_Share/ \;
sleep 2
done
让我们确保此脚本在 Raspberry 启动时启动。这与 picam.py 在启动时启动的方式相同。
sudo nano /etc/init.d/tmpfsToNAS
插入以下代码。我在stuffaboutcode.com的一篇文章的帮助下设置了它。
#! /bin/sh
# /etc/init.d/tmpfsToNAS
### BEGIN INIT INFO
# Provides: Copies images from the picam tmpfs to a NAS
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Simple script to start a program at boot
# Description: Copies images from the picam tmpfs to a NAS
### END INIT INFO
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting copy tmpfs to NAS"
sh /opt/tmpfsToNAS.sh 2>&1 &
;;
stop)
echo "Stopping copy tmpfs to serv"
tmpfsPID=`ps auxwww | grep tmpfsToNAS.sh | head -1 | awk '{print $2}'`
kill -9 $tmpfsPID
;;
*)
echo "Usage: /etc/init.d/tmpfsToNAS {start|stop}"
exit 1
;;
esac
exit 0
使脚本可执行
sudo chmod 755 /etc/init.d/tmpfsToNAS
注册脚本以在启动时运行
sudo update-rc.d tmpfsToNAS defaults
最后编辑 picam.py 脚本。让它写入我们新的 TMPFS 位置。
sudo nano ~/picam.py
更改行
filepath = "/mnt/picam_tmpfs"
我建议重启您的 Pi 并检查一切是否顺利。您应该看到图像在 TMPFS 文件夹中创建,但很快被复制到 NAS 共享。
历史
- 2014-04-21:首次发布
- 2014-04-21:添加了 Web 服务器安全性
- 2014-05-08:添加了网站统计信息(图像计数和时间跨度)以及夜间阈值和灵敏度更改
- 2014-05-11:为通过 WIFI 将文件复制到 NAS 添加了 TMPFS 解决方案