资讯详情

资讯详情

树莓派智能可视门铃DIY:视频流与移动侦测实战

把门口那台传统可视门铃换掉之前我已经在树莓派摄像头和视频流这类项目上折腾了大半年。当时手头正好有一块树莓派4B和官方OV5647摄像头模块索性把门铃方案整个重做远程查看摄像头、移动侦测、自动保存视频这三件事在一个板子上全部搞定还不用被云平台账号和各种增值服务绑架。这篇文章就是我整套方案的完整复盘从硬件选型、系统搭建到具体软件实现包括我踩过的各种坑和调参思路。不管你是第一次拿树莓派做摄像头项目还是想把手头的板子变成家庭看护设备这套思路都可以直接拿去做底子。这个项目的核心其实不复杂先是把摄像头的实时画面通过网络推出去解决“怎么看”再对画面做运动检测解决“怎么判断有人来”最后在触发事件时把视频片段存下来解决“怎么留证据”。听起来简单真正落地的时候会碰到视频流卡顿、检测误报、存储卡损坏等一堆问题。好在树莓派生态成熟绝大多数坑都有现成的解法下面逐块拆开讲。1. 需求拆解与整套方案选型1.1 先把“可视门铃”拆成四个功能点我习惯一开始就把需求拆成功能点不然边做边改容易乱。这次门铃项目的最终清单如下第一实时画面预览。门口有人按铃或者靠近时我要能立刻看到门口的画面。这里的“立刻”很关键延迟超过两秒体验就很难受所以选择了低延迟的HTTP实时视频流方案。第二远程访问能力。我要求在局域网内随时随地看比如在客厅打开手机浏览器直接看门口画面。考虑到偶尔有出门在外的需求也要给公网访问留一条路但公网访问必须做安全控制不能把裸的视频流直接暴露到公网上。第三移动侦测。门铃必须能判断“门口有人”而不是一整天对着静止画面傻看。这里有两个方向用PIR人体红外传感器做硬件触发或者用软件分析画面像素变化。我最终选择了画面侦测为主因为视频流本身就在跑直接用画面差异做检测不需要额外传感器还能顺便把移动区域画出来。第四自动保存视频。一旦检测到移动自动把你按时间段生成视频片段存下来。存储格式、分辨率、保存周期都要可配置。这里我强烈建议用事件触发录像而不是24小时不间断录像一方面节省存储空间另一方面排查历史事件时也方便不需要在一堆连续录像里翻找。1.2 硬件到底怎么选树莓派型号、摄像头模组、电源和存储硬件选型是整个项目的地基。我先说结论主控选择树莓派4B4GB内存版本最佳摄像头选择官方800万像素OV5647 CSI接口模块电源选择官方5V 3A适配器存储采用64GB A2高速TF卡录像文件保存到外接USB移动硬盘或者NAS。为什么不推荐3B3B的网络接口只有百兆Wireless比较拉胯视频流的并发访问和预览流畅度会受限。CPU性能也偏弱720P视频流的Motion检测跑起来CPU占用会持续在80%以上长期运行压力偏大。树莓派5虽然性能强不少但对应的CSI摄像头排线是22针网上很多二手摄像头模块配的是老款15针排线买回来还得换线对新手不友好。4B是当前性价比最高的平衡点。摄像头这一块我首先排除USB摄像头。外接USB摄像头在树莓派上经常出现设备号漂移、USB带宽被占用、UVC驱动兼容差、帧率忽高忽低的问题而且CSI摄像头直接走板子的摄像头接口由SoC的ISP模块处理CPU占用低得多。价格方面官方模组也不贵成像质量在光线足够时相当能打。唯一的坑是排线方向容易插反后面我会专门说。对了还要强调电源。很多树莓派摄像头项目运行一个月后频繁重启、画面花屏、视频莫名其妙丢失多半是电源不行。树莓派4B最大功耗可以达到6W以上普通手机充电器或者劣质5V 2A适配器经常带不动电压跌落直接导致SD卡写入异常。别在电源上省钱。1.3 软件路线怎么选三个方案对比硬件定了软件路线我研究过三种各有取舍我做了一个对比表给你参考方案视频流输出移动侦测自动保存适合人群A. MJPG-streamer MotionMJPG-streamer提供浏览器实时画面Motion负责帧差检测Motion自动保存事件视频片段想最短时间搭好、配置项直观的用户B. go2rtc Python/OpenCVgo2rtc提供WebRTC超低延迟画面OpenCV自写帧差检测自写代码保存视频片段想精细控制检测逻辑、后续接Home Assistant的折腾派C. 纯Python OpenCV直接用OpenCV显示窗口或自建HTTP流OpenCV帧差OpenCV保存片段纯学习、不想装额外依赖D. RTSP NVR联动树莓派推RTSP流海康大华NVR做存储NVR或树莓派做检测NVR集中存储手头已有监控NVR、想统一管理最终我采用的是A方案的变体MJPG-streamer负责实时预览和远程查看直接用Motion做侦测与自动保存两者同时挂在同一个摄像头设备上。这套组合配置少、稳定性高、维护成本低。后来测试WebRTC方案时发现go2rtc的延迟确实更惊艳但Motion的录像管理太省心了时间有限的话建议先上方案A跑顺了再去折腾go2rtc。2. 系统环境与摄像头驱动准备2.1 系统刷写与基础设置系统我选择Raspberry Pi OS Lite 64位版本不带桌面。门铃项目不需要图形界面省下来的内存和CPU全部留给视频流和检测进程。使用官方Raspberry Pi Imager烧录工具刷写到TF卡刻录界面里有一个齿轮按钮可以直接预配置SSH开启、Wi-Fi名称密码、用户名密码等多项设置。这一步强烈建议提前配置好尤其是没有显示器键盘操作的时候能省很多时间。刷写完成后插电开机我习惯通过路由器后台找到树莓派的IP地址再SSH登录。如果你把主机名改成了doorbell在支持mDNS的局域网里可以直接ssh pidoorbell.local更方便。登录后第一步执行系统更新sudo apt update sudo apt upgrade -y更新完顺手改一改时区为Asia/Shanghai不然视频文件的时间戳和系统日志时间会对不上。时间同步我加了systemd-timesyncd自动校时门铃项目的录像时间精确性还是重要的。2.2 启用CSI摄像头排线、接口和驱动验证树莓派的CSI摄像头不是插上就能认出来的。第一步要用raspi-config开启接口sudo raspi-config在Interface Options里找到Camera并启用重启系统。重启后不要急着打开软件先验证摄像头是否真正被内核识别v4l2-ctl --list-devices正常情况下能看到类似unicam或csi设备并映射到/dev/video0。如果上面命令提示找不到工具安装一下sudo apt install -y v4l-utils树莓派4B需要把相机排线接到标有CAMERA或者CSI的接口上插线时排线金属触点方向要朝HDMI接口那侧插到底后扣紧卡扣。有一个高频坑老版本树莓派用15针CSI排线树莓派5换成了22针线序和物理规格完全不同所以购买摄像头模块时务必确认适配你的板子型号。树莓派5用户还可以用libcamera-hello命令验证摄像头4B官方驱动下也支持libcamera栈但是v4l2-ctl检测最通用。如果检测不到设备先看dmesg输出有没有camera相关的错误dmesg | grep -i camera多数情况都是排线没插到位或者方向反了重新插一次通常能解决。如果你用的是USB摄像头接主板的蓝色USB 3.0接口供电更稳但后文所有命令里的设备路径要自己确认非官方CSI摄像头还是建议优先走CSI方案。2.3 网络规划与静态IP视频流服务必须有一个稳定不变的局域网地址。树莓派默认上网方式不固定路由器DHCP每次分配可能变如果IP变了你手机书签存的视频流地址就全废了。我在libcamera给DHCP保留了一个固定IP方法是在路由器管理界面把树莓派的MAC地址绑定为静态内网地址。如果你不想依赖路由器也可以在树莓派系统层面配置静态IP。新版Raspberry Pi OS默认网络管理是NetworkManager配置静态IP可以这样sudo nmcli con modify Wired connection 1 \ ipv4.addresses 192.168.1.200/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 192.168.1.1 \ ipv4.method manual sudo nmcli con up Wired connection 1Wi-Fi环境把连接名称替换成你的Wi-Fi SSID即可。我最终用有线接入了路由器因为视频流走无线会多一层不稳定因素。如果非要无线记得选5GHz频段别用2.4GHz延迟和带宽差异非常明显。3. 实现远程实时查看画面3.1 视频流方案怎么选远程查看的本质是把摄像头视频压缩后通过网络传输到浏览器或播放器。树莓派摄像头项目里常见这三条技术路线MJPG-streamer是历史最悠久、配置最简洁的方案。它把摄像头输出的MJPEG画面直接通过HTTP以JPEG帧序列形式传输浏览器打开对应的actionstream地址就能看到实时画面延迟在200到400毫秒对于门铃场景完全够用。优点是没有转码过程CPU占用低缺点是画质压缩比一般如果网络带宽不够会出现明显卡顿。RTSP方案用ffmpeg把摄像头编码为H.264后推RTSP流延迟低、画质和带宽平衡好而且能被海康大华这类NVR设备直接拉取适合已有监控系统的用户。但纯RTSP裸流在普通浏览器里没法直接播放需要额外套一层转WebRTC的壳配置复杂度高。go2rtc是我后来试验的方案它内置WebRTC和WebSocket能力可以把RTSP流转换成浏览器原生支持的格式延迟可以做到100毫秒级别还能把摄像头接入Home Assistant。代价是又多一个常驻服务对小项目来说是需要权衡的。综合来看我推荐第一套先跑MJPG-streamer你能在十分钟内看到画面获得正反馈。后面想精细化再上go2rtc。3.2 用MJPG-streamer快速输出实时画面MJPG-streamer需要自行编译树莓派4B上编译时间大概三五分钟。先把依赖和源码准备好sudo apt update sudo apt install -y build-essential cmake libjpeg62-turbo-dev git git clone https://github.com/jacksonliam/mjpg-streamer.git cd mjpg-streamer/mjpg-streamer-experimental make编译完成后直接运行export LD_LIBRARY_PATH$(pwd) ./mjpg_streamer -i input_uvc.so --device /dev/video0 -r 1280x720 -f 15 -q 80 -o output_http.so -p 8080 -w .参数里-r是分辨率-f是帧率-q是JPEG压缩质量。在浏览器打开http://树莓派IP:8080/?actionstream就能看到实时画面。挂成系统服务时用systemd管理写一个/etc/systemd/system/mjpg-streamer.serviceExecStart行用上面的命令即可。启动后我还开启了对外的身份认证./mjpg_streamer -i input_uvc.so --device /dev/video0 -r 1280x720 -f 15 -q 80 -o output_http.so -p 8080 -w . -c admin:你的密码加上认证后浏览器访问会弹出账号密码框。这一步极其重要尤其是准备用公网访问时没有认证的设备会被扫描器当玩具一样扫出来。3.3 远程访问局域网直连、端口映射与安全注意事项先说你最可能用到的局域网访问手机连Wi-Fi后直接打开上面那个地址就行。这里我不建议用ZeroTier这类组网工具虽然它们确实方便且免费但为了保持方案简单和零依赖我选择了最传统的思路路由器端口映射加DDNS。如果你家里有公网IP路由器上把树莓派内网IP的8080端口映射到公网的某个高位端口比如18080然后在路由器里配置DDNS把这台树莓派的地址变成类似myhome.ddns.net:18080的样子出门在外也能访问。但这里一定要听我一句劝端口映射前务必改掉默认的访问端口务必在MJPG-streamer里加访问账号密码。公网上面时刻都有大量扫描器在扫各种设备的默认端口无密码视频流暴露在公网上等于把家门口的摄像头直接敞开给别人看。如果你的运营商没有分配公网IP那就放弃公网访问的念想老老实实只用局域网或者借助一台带公网IP的服务器自建加密隧道再转发而这不是本文讨论的重点。4. 移动侦测与自动保存视频的实现4.1 两种移动侦测路线对比移动侦测是这个门铃项目里最值得花时间研究的部分。我对比过两条路线硬件方案是PIR人体红外传感器HC-SR501把它接到树莓派GPIO口检测到人体红外辐射变化时触发录像。优点是极低功耗树莓派平时可以睡大觉PIR唤醒后再开机录像缺点是只能检测活体红外热源动物经过、小孩穿厚衣服、极端温度环境都可能误判或漏判而且PIR本身的灵敏度调节需要旋钮配合调试比较费劲。软件方案是利用视频帧之间的像素差异做检测。Motion和OpenCV都有现成实现优点是不需要额外硬件视频流本身就跑在系统里顺手就能做检测检测结果能直接叠加画面框选方便后期查看。缺点是CPU占用比PIR稍稍偏高光线缓慢变化或背景树叶摆动会引起误报。我选择了软件方案原因很实际门铃视频流本来就24小时运行不用白不用而且事件录像需要的是“一段时间段”的视频软件检测可以和录像无缝衔接。真正需要低功耗场景的朋友可以考虑PIR唤醒树莓派的进阶玩法。4.2 用Motion快速搭建侦测录像Motion是Linux平台上老牌的开源监控软件一个守护进程就能完成画面采集、帧差检测、视频编码、事件录像和通知。安装很简单sudo apt install -y motion配置文件在/etc/motion/motion.conf改动量比较大但绝大多数默认值能跑。我这边调试之后的关键参数是这样daemon on width 1280 height 720 framerate 5 threshold 2000 event_gap 60 pre_capture 3 post_capture 5 movie_output on movie_codec mp4v movie_max_time 60 target_dir /var/lib/motion stream_port 8081 stream_localhost off stream_quality 80 webcontrol_localhost off逐项说下含义width、height和framerate控制采集分辨率与检测帧率我没有开太高720P5fps足够门铃场景降低CPU负担。threshold是触发移动侦测所需的变化像素总数数值越大越不敏感默认值就够用。pre_capture和post_capture特别关键pre_capture会把检测到移动前3秒的画面也保存post_capture会在移动结束后继续录5秒保证视频片段完整。target_dir是事件录像输出目录。stream_port让Motion也能输出一个实时预览流这个端口和MJPG-streamer端口要区分开。配置完成后sudo systemctl enable motion sudo systemctl start motion在target_dir目录下就会生成按事件组织的录像文件。我自己实测下来Motion的默认检测逻辑在光线稳定的走廊表现很棒但在门口这种白天晚上光线变化大的场景会误报偏多这时需要去adjust threshold或加入后续说的ROI改进思路。4.3 用Python OpenCV自定义侦测录像代码、参数和调优思路Motion虽然开箱即用但如果你想在检测到移动时叠加时间水印、推送通知到手机、框出移动区域或者做更智能的人脸框选Motion的配置就有点力不从心了。这个场景下我建议用Python直接调OpenCV写一个检测脚本灵活度完全在你手上。下面是我整理的一个精简可运行版本保存为motion_detector.pyimport cv2 import datetime import os import numpy as np THRESHOLD 25 MIN_AREA 500 SAVE_DIR motion_clips ROI None # 可以设置感兴趣区域例如 (x, y, w, h) os.makedirs(SAVE_DIR, exist_okTrue) cap cv2.VideoCapture(0) # 设置分辨率树莓派4B建议 1280x720 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) ret, frame cap.read() if not ret: print(无法读取摄像头画面) exit(1) prev_gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) prev_gray cv2.GaussianBlur(prev_gray, (21, 21), 0) recording False writer None no_motion_count 0 while cap.isOpened(): ret, frame cap.read() if not ret: break if ROI: x, y, w, h ROI frame frame[y:yh, x:xw] gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray cv2.GaussianBlur(gray, (21, 21), 0) diff cv2.absdiff(prev_gray, gray) ret2, thr_img cv2.threshold(diff, THRESHOLD, 255, cv2.THRESH_BINARY) thr_img cv2.dilate(thr_img, None, iterations2) contours, _ cv2.findContours(thr_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) motion_detected False for contour in contours: if cv2.contourArea(contour) MIN_AREA: continue motion_detected True x, y, w, h cv2.boundingRect(contour) cv2.rectangle(frame, (x, y), (x w, y h), (0, 0, 255), 2) timestamp datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) cv2.putText(frame, timestamp, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 2) if motion_detected: if not recording: ts datetime.datetime.now().strftime(%Y%m%d_%H%M%S) filename os.path.join(SAVE_DIR, fmotion_{ts}.avi) fourcc cv2.VideoWriter_fourcc(*XVID) writer cv2.VideoWriter(filename, fourcc, 15.0, (frame.shape[1], frame.shape[0])) print(检测到移动开始录像:, filename) recording True writer.write(frame) no_motion_count 0 else: if recording: no_motion_count 1 # 连续40帧无移动则停止录像约合2.6秒 if no_motion_count 40: writer.release() writer None recording False print(移动结束录像已保存) prev_gray gray cv2.imshow(Doorbell Motion, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() if writer: writer.release() cv2.destroyAllWindows()运行前安装依赖sudo apt install -y python3-opencv python3-pip pip3 install numpy --break-system-packages然后直接跑python3 motion_detector.py简单讲解代码里的几个核心点先用GaussianBlur对灰度帧做模糊消除成像传感器自身的噪声再用cv2.absdiff计算当前帧和上一帧的差异像素差大于25的位置会被置白dilate膨胀让白色区域连成块避免检测目标中间空洞被拆成多个碎片min_area参数过滤掉面积小于500像素的干扰源比如飞过的虫子、窗帘边缘等recording状态配合no_motion_count实现录像开始和延迟结束的逻辑。关于参数调优我的实际经验是光线稳定的室内THRESHOLD可以设在20到30之间门口这类光线变化大的地方提高到30到40否则下午三点的影子偏移就能触发录像。MIN_AREA至少要覆盖到成年人身体面积的十分之一吧不然一只猫走过去会触发几十段录像。如果门口有一棵老是随风摇动的树建议引入ROI只盯门口台阶区域树影摇晃几乎不会误报。这个办法比单纯调threshold有效得多。4.4 自动保存与录像文件的目录结构事件录像生成后建议按日期建目录管理避免所有片段堆在一个目录里没法看。我习惯在脚本里固化这个逻辑每天零点自动生成新文件夹mkdir -p /home/pi/monitor/$(date %Y%m%d)同时还要解决存储空间问题。树莓派的系统TF卡不适合长时间连续写入Motion的事件录像和OpenCV的视频片段都建议设置到外接USB硬盘或NAS。我在系统里挂载了一块旧移动硬盘target_dir或SAVE_DIR直接指过去。磁盘空间管理用crontab定期清理例如保留最近30天的录像0 3 * * * /usr/bin/find /mnt/usb/monitor -name *.avi -mtime 30 -delete这样既不会爆盘也不用担心录满卡死。注意如果你的预算只够一块TF卡那至少选购A2标准的品牌卡并把系统日志重定向到tmpfs内存中减少对TF卡的频繁擦写后面排查章节我会再细说。5. 告警通知与录像文件日常管理5.1 把告警推送到手机光有录像还不够作为门铃我需要“有人来”这件事第一时间被我知道。最简单粗暴的方式是在树莓派GPIO上接一个蜂鸣器检测到移动时响一声适合在家时用。但大多数人需要的还是手机通知实现思路是利用Webhook服务把检测事件推送成手机弹窗。操作流程是在任意支持Webhook推送的手机通知服务上申请一个秘钥然后在OpenCV检测到recording状态变化时发送一个HTTP请求。给出一段简化示例方便你集成到脚本中import requests def notify(title, message): data {title: title, body: message} requests.post(https://push.example.com/path/to/your/token, jsondata) # 检测到移动且刚开始录像时 notify(门口有人移动, f时间 {datetime.datetime.now()})如果不想在脚本里引入requests依赖直接用curl也能实现同样效果curl -X POST https://push.example.com/path/to/your/token \ -H Content-Type: application/json \ -d {title:门口有人移动,body:检测到移动事件}这里有个重要细节推送一定要加冷却时间限制。否则一只猫在门口来回走五分钟你的手机会被几十条推送刷爆。我的做法是记录上次推送时间两次推送间隔至少60秒既能保证不漏通知又不会骚扰自己。5.2 事件录像的存储与清理策略录像文件的存储管理是门铃长期稳定运行的关键。先说观点视频文件比日志文件大一到两个数量级绝对不能全部存在系统TF卡上。我的存储结构这样分配TF卡只放操作系统和程序代码外接USB硬盘或挂载NAS专门放monitor录像目录。USB移动硬盘便宜量大长期连续写入没问题坏了大不了换一块系统卡不会被拖累。日常清理除了crontab定期find删除30天前的文件我加了一个检测磁盘剩余空间的脚本作为兜底。脚本判断如果USB硬盘剩余空间低于5GB就自动删除最旧的视频片段防止盘满导致Motion崩溃或者OpenCV脚本写入失败。两个机制互相兜底会让你省心很多。期间我发现了一个细节USB硬盘如果长期在树莓派USB口上插着建议在树莓派系统设置中关闭USB自动休眠否则树莓派每过一段时间会把USB硬盘休眠等事件触发时盘还在唤醒状态头几秒的录像会丢失。这个坑特别隐蔽我排查了好久才意识到。5.3 文件的命名规则与检索录像文件命名要包含时间信息便于事后快速查找。我沿用类似motion_20250101_203015.avi的命名格式日期时分秒都在文件名里。如果你用NAS或者文件管理器浏览时按名称排序就是按时间排序找某天的记录非常直观。如果文件名不加时间后期几百个片段堆在一起你知道哪个是哪个吗绝对不行。进阶做法是在文件名尾部追加检测区域的标记比如motion_20250101_203015_frontdoor.avi通过文件管理器直接筛选门口区域的事件即可。6. 常见问题排查与实操避坑6.1 摄像头识别不到怎么办这个问题在树莓派摄像头项目里出现频率最高而且九成是排线问题而不是硬件坏了。首先要确认排线金属触点方向正确树莓派4B的CSI接口要把触点朝HDMI方向插入。其次检查卡扣是否扣紧插到底后卡扣会发出轻微咔哒声。树莓派5和树莓派4B的排线接口针脚数不同购买摄像头时问清楚适配型号。排除排线问题后检查系统层面的摄像头接口是否启用执行sudo raspi-config看一下Camera选项是否处于Enabled。再查看内核日志dmesg | grep -i camera如果能看到设备注册但v4l2-ctl --list-devices仍然没有video设备我通常先执行sudo reboot重启一次树莓派有时候摄像头设备初始化顺序不对重启能解决很大一部分问题。还有一个细节部分摄像头模组在树莓派上要用到/boot/config.txt里的dtoverlaycamera-auto新系统默认加载不用改。老教程会让你加dtoverlayov5647对新版内核反而可能造成冲突别照抄。6.2 画面花屏、绿屏、黑白是哪些原因画面异常时先检查电源。树莓派4B供电不足的典型症状就是USB设备不断重连、视频流花屏、画面偏绿或者拍几下卡死。我最初用的5V 2A充电器1小时出现一次画面条纹换成官方5V 3A后问题彻底消失前后对比非常明显。排线接触不良也会导致花屏重新插拔时还是那个规则断电操作排线插到位再扣卡扣不要带电拔插。绿屏还可能出现在刚启动阶段内核视频驱动正在初始化等几秒画面恢复就没事。分辨率设置太极端也可能导致异常CSI摄像头在树莓派上跑1920x108030fps虽然参数支持但系统负载和发热明显增加不如稳定在1280x72015fps肉眼感知的清晰度差不了多少系统稳定性大幅提升。6.3 移动侦测误报多、漏报多是配置问题误报的核心原因是画面发生了变化但并不是人。常见场景有门口树影随风晃动、窗帘被风吹动、飞虫飞过镜头、傍晚灯光自动开启导致亮度骤变、天空云层遮挡导致光线变化。这些场景的解决方案可以组合使用第一调大Motion的threshold参数或代码里的MIN_AREA。树影晃动通常像素区域大但密度低阈值适当提升能过滤掉。第二设置检测区域ROI。门口有人必经的区域通常只占画面一小块把检测锁定在台阶、门把手附近其他区域发生什么变化都忽略。第三引入冷却时间。即使检测到移动也强制间隔10秒以上才能再次触发录像避免一个目标连续触发多段短视频。第四对于灯光开关这种全局亮度突变可以考虑在代码里检测画面整体平均亮度变化如果整帧亮度一起突变就认为是环境光变化不做移动事件处理。漏报的典型原因是目标太小或者移动太慢。太慢的移动导致帧间差异像素数低于阈值这时可以降低检测帧率到每秒5帧拉长帧间时间间隔慢动作反而更容易暴露。MIN_AREA也不要设得太大像素面积过滤太狠会把蹲下来系鞋带的人漏掉。6.4 长期运行维护TF卡保护、温度与进程守护门铃项目是7x24小时运行的服务我对长期稳定性比较在意。三个方面必须专门处理第一TF卡写入寿命。系统长时间跑日志、录像写入都会不断消耗TF卡。我把系统日志重定向到内存文件系统配置文件在/etc/systemd/journald.conf里设置Storagevolatile日志不再落盘。事件录像必须写到USB硬盘不要让Motion的目标目录指向TF卡。在TF卡剩余空间稍足的前提下定期用dd命令全盘备份镜像万一卡坏了十几分钟就能恢复系统。第二温度控制。树莓派4B在跑720P视频流加检测时外壳温度很可能稳定在70度左右不加散热长时间会降频卡顿。我给树莓派加了一个带风扇的铝合金散热壳风扇接5V GPIO口夏天高温也能稳定在50度上下。如果追求静音可以接一个温控风扇模块温度超过阈值再转。第三进程守护。MJPG-streamer和Motion任何一方挂了门铃功能就瘫痪一半。我给两个服务分别配置了systemd自动重启Restartalways RestartSec10这样进程异常退出后10秒会自动拉起我不用半夜爬起来手动重启服务。整套系统跑顺之后我最大的体会是这个项目最大的成本不是硬件而是调试过程中的耐心。MJPG-streamer和Motion的组合我前后调了两个周末后面加入OpenCV脚本又折腾了几天但一旦跑稳了它就是一套完全没有云平台依赖、数据全在自己手里的私有门铃。后续想扩展的话还可以接一个语音对讲模块或者把移动侦测结果接入智能家居平台甚至用人脸识别判断是不是熟人。这个底子打好之后所有扩展都只是加功能而不用推翻重来。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →