[树莓派] 1.树莓派公网监控
纯净界面:只显示画面 + 时间/帧率
目标:在树莓派上用 OpenCV + Flask 搭一个极简监控网页。
特点:纯黑背景、全屏自适配、右下角时间+FPS、无任何按钮和多余元素。
项目总结
利用树莓派和摄像头实现局域网监控
利用内网穿透实现公网显示
文章目录
一、后续操作
直接复制粘贴
1.无开机自启操作步骤
在配置完之后只需要输入这几行命令即可。
树莓派开机进入
cd ~/camera_monitor
激活虚拟环境
source camera_env/bin/activate
插上摄像头,直接运行(用系统Python)
python3 camera_monitor.py

在同一局域网的设备上,打开浏览器访问:
http://树莓派IP地址:5000

如需修改
nano camera_monitor.py
进入py文件,修改帧率和像素。

完成后按 Ctrl + O ,
然后回车保存,按 Ctrl + X 退出。
二、树莓派监控配置及实现
0.硬件准备
- 树莓派
- 摄像头模块或USB摄像头
- MicroSD卡、稳定电源、网络连接
1.系统准备
1.1 烧录系统
使用 Raspberry Pi Imager 将最新 Raspberry Pi OS 烧录到SD卡,
(在我上一篇文章里讲过了)
1.2 启用官方摄像头模块
(新版本有修改,或者不用修改)
(现在在设置里找不到了,可能是默认开启了,不用设置)
如果是老版本系统:
sudo raspi-config
# 选择 Interface Options -> Camera -> Enable
#然后重启
sudo reboot
#这是关机命令
sudo shutdown -h now
1.3 系统更新与基础依赖
五个命令总览,依次运行。
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-dev
sudo apt install -y libjpeg-dev libpng-dev libv4l-dev v4l-utils
sudo apt install -y cmake build-essential pkg-config
sudo apt autoremove -y && sudo apt autoclean
第1个命令
sudo apt update && sudo apt upgrade -y

等待

OK

第2个命令
sudo apt install -y python3-pip python3-dev

第3个命令
sudo apt install -y libjpeg-dev libpng-dev libv4l-dev v4l-utils

第4个命令
sudo apt install -y cmake build-essential pkg-config

第5个命令
sudo apt autoremove -y && sudo apt autoclean

2.安装Python依赖
2.1 系统包下载管理
sudo apt install -y python3-opencv python3-flask python3-numpy

验证安装
python3 -c "import cv2, flask, numpy; print('✅ 环境准备完成')"

2.2 测试摄像头
python3 -c "
import cv2
cap = cv2.VideoCapture(0)
print('✅ 摄像头正常' if cap.isOpened() else '❌ 摄像头失败')
cap.release()
"

3.部署程序
3.1 创建项目目录
mkdir -p ~/camera_monitor
cd ~/camera_monitor
删除旧环境,创建支持系统包的新环境
rm -rf camera_env
python3 -m venv camera_env --system-site-packages
source camera_env/bin/activate

建py文件
touch camera_monitor.py
进py文件
nano camera_monitor.py
将代码保存在 ~/camera_monitor/camera_monitor.py
(这里只是步骤展示,代码太长了,有需要的私信我)

输入Python 代码后,
完成后按 Ctrl + O ,
然后回车保存,按 Ctrl + X 退出。
如果输入错误,需要删文件
cd Desktop #文件位置
ls
rm 文件名
rm camera_monitor.py
3.2 直接测试运行
cd ~/camera_monitor
激活虚拟环境
source camera_env/bin/activate
插上摄像头,直接运行
python3 camera_monitor.py
你就可以看见了

Ctrl+c是结束。

这行的网址就是监控网址
* Running on http://192.168.137.32:5000
同一局域网设备打开浏览器,访问:
http://树莓派IP地址:5000
在我这也就是 http://192.168.137.32:5000
在电脑热点设置里(连接电脑热点是最方便的)

或者提前用如下命令行看树莓派ip
hostname -I

3.3最终效果
利用如下硬件:

树莓派zero2w+摄像头
实现监控画面如下:

因为我要放在其他项目里
(比如我发布的【开发项目】 1.Seaclear海洋垃圾识别项目展示)
这里仅需要干净的视频流,越干净越方便改动。
4.自定义设置
只需修改代码 __init__ 方法顶部的两行:
# ============ 在这里修改设置 ============
self.fps = 15 # 帧率设置 (1-30)
self.resolution = (640, 480) # 分辨率设置 (宽, 高)
# 常用分辨率选项:
# (320, 240) # 小尺寸 - 显示 "月-日 时:分"
# (640, 480) # 标准尺寸 - 显示 "月-日 时:分"
# (800, 600) # 中等尺寸 - 显示完整时间
# (1024, 768) # 大尺寸 - 显示完整时间
# (1280, 720) # HD 720p - 显示完整时间
# (1920, 1080) # Full HD 1080p - 显示完整时间
# ========================================
分辨率与时间显示格式对应关系:
| 分辨率 | 时间格式 | 适用场景 |
|---|---|---|
| 320×240 | 月-日 时:分 | 省流量,手机访问 |
| 640×480 | 月-日 时:分 | 标准,默认推荐 |
| 800×600 | 年-月-日 时:分:秒 | 中等画质 |
| 1024×768 | 年-月-日 时:分:秒 | 清晰画质 |
| 1280×720 | 年-月-日 时:分:秒 | HD,局域网推荐 |
| 1920×1080 | 年-月-日 时:分:秒 | 全高清,录像用 |
带宽参考估算:
| 配置 | 估算带宽 |
|---|---|
| 320×240 @ 10fps | ~0.5 Mbps |
| 640×480 @ 15fps | ~1-2 Mbps |
| 1280×720 @ 15fps | ~3-5 Mbps |
| 1920×1080 @ 15fps | ~5-8 Mbps |
修改后重启服务生效:
sudo systemctl restart camera-monitor.service
5.故障排除
遇到的问题都有解决方案,不行就问问AI。
故障1: 读取帧失败,稍后重试
# 查看摄像头设备
v4l2-ctl --list-devices
# 查看支持的格式
v4l2-ctl --list-formats-ext -d /dev/video0
# 用ffmpeg直接测试能否抓帧
ffmpeg -f v4l2 -i /dev/video0 -frames:v 1 /tmp/test.jpg 2>&1 | tail -5
出现如下代码:
asuna@raspberrypi:~/camera_monitor $ ffmpeg -f v4l2 -i /dev/video0 -frames:v 1 /tmp/test.jpg 2>&1 | tail -5 libpostproc 56. 6.100 / 56. 6.100
[video4linux2,v4l2 @ 0x1deeb60] ioctl(VIDIOC_G_PARM): Inappropriate ioctl for device
[video4linux2,v4l2 @ 0x1deeb60] Time per frame unknown
[video4linux2,v4l2 @ 0x1deeb60] ioctl(VIDIOC_STREAMON): Invalid argument /dev/video0: Invalid argument
/dev/video0 是树莓派官方摄像头的 unicam CSI 原始接口,它输出的是 Bayer RAW 格式,OpenCV 和 ffmpeg 无法直接读取。
真正可用的处理后视频设备是 /dev/video13(bcm2835-isp 输出)。
再测试一下
(camera_env) asuna@raspberrypi:~/camera_monitor $ python3 -c " import cv2 # 测试 ISP 输出设备 for dev in [13, 14, 15, 16, 20, 21]: cap = cv2.VideoCapture(dev, cv2.CAP_V4L2) if cap.isOpened(): ret, frame = cap.read() print(f'/dev/video{dev}: isOpened=True, read={ret}') cap.release() else: print(f'/dev/video{dev}: 无法打开') "
出现如下代码:
[ WARN:0@0.728] global ./modules/videoio/src/cap_v4l.cpp (902) open VIDEOIO(V4L2:/dev/video13): can't open camera by index /dev/video13: 无法打开
[ WARN:0@10.759] global ./modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video14): select() timeout. /dev/video14: isOpened=True, read=False
[ WARN:0@20.787] global ./modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video15): select() timeout. /dev/video15: isOpened=True, read=False
[ WARN:0@20.792] global ./modules/videoio/src/cap_v4l.cpp (902) open VIDEOIO(V4L2:/dev/video16): can't open camera by index /dev/video16: 无法打开
[ WARN:0@20.792] global ./modules/videoio/src/cap_v4l.cpp (902) open VIDEOIO(V4L2:/dev/video20): can't open camera by index /dev/video20: 无法打开
[ WARN:0@30.813] global ./modules/videoio/src/cap_v4l.cpp (1013) tryIoctl
VIDEOIO(V4L2:/dev/video21): select() timeout. /dev/video21: isOpened=True, read=False
先安装并测试:
sudo apt install -y python3-picamera2
python3 -c "
from picamera2 import Picamera2
cam = Picamera2()
cam.start()
import time; time.sleep(1)
frame = cam.capture_array()
print('✅ picamera2 读帧成功, shape:', frame.shape)
cam.stop()
"
再运行就可以观察到问题解决了
python3 ~/camera_monitor/camera_monitor.py
故障2: 摄像头颜色问题
如果颜色不对,比如
现实里的黄色在画面里是蓝色,
现实里的红色在画面里是蓝色,
现实里的蓝色是红色,
frame = self.camera.capture_array()
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) # 注释掉这行
问题1:摄像头无法识别
# 检查设备节点是否存在
ls /dev/video*
# 将当前用户加入 video 组
sudo usermod -a -G video $USER
sudo reboot
# USB摄像头:查看设备信息
v4l2-ctl --list-devices
问题2:网页无法访问
# 确认程序正在运行
ps aux | grep camera_monitor
# 确认端口正在监听
sudo ss -tlnp | grep 5000
# 查看防火墙
sudo ufw status
问题3:画面延迟/卡顿
- 降低帧率(改为 10 FPS)
- 降低分辨率(改为 640×480)
- 降低JPEG质量(将代码中
85改为70) - 检查网络质量
问题4:服务启动失败
# 查看详细错误信息
sudo journalctl -u camera-monitor.service -n 30
# 手动测试能否直接运行
python3 /home/pi/camera_monitor/camera_monitor.py
问题5:GPU内存不足(画面异常)
sudo raspi-config
# Advanced Options -> Memory Split -> 设置为 128 或 256
三、实现公网访问
用你申请的公网ip或者使用内网穿透即可实现。
这里不做详细介绍,只需要配置好,然后把局域网网址和端口输入进去即可实现。
(没开通,还得先花钱开通,后面做项目开通了补上图片)
很好实现的。

1580

被折叠的 条评论
为什么被折叠?



