需要安装的 Python 包
- OpenCV:用于处理图像和视频。
- PiCamera(可选):如果你使用的是官方的 Raspberry Pi Camera Module,可以通过
opencv
直接访问,也可以安装picamera
库用于更深层次的控制。
安装步骤
先确认摄像头模块已经启用:
- 在终端中运行:
sudo raspi-config
- 在菜单中找到 Interface Options,选择 Camera,并启用。
- 重启树莓派:
sudo reboot
然后安装好需要的库,可以参考:
树莓派–OpenCV安装踩坑
树莓派明明安装了opencv和numpy,却找不到
测试摄像头状态
ls /dev/video*
如果有 video0 就说明摄像头没有问题
如果读取不到摄像头,可能原因
-
摄像头被其他进程占用:
- 如果其他程序(例如
raspivid
、motion
或 OpenCV)正在使用摄像头,picamera
库将无法初始化连接。
- 如果其他程序(例如
-
摄像头配置不正确:
- 树莓派的摄像头模块可能未正确启用或初始化。
-
设备节点冲突:
- 如果有多个视频设备,系统可能尝试分配错误的设备节点。
-
显存不足:
- 树莓派的 GPU 内存分配不足,无法满足
picamera
的需求。
- 树莓派的 GPU 内存分配不足,无法满足
解决方法
** 1:检查摄像头是否被占用**
- 使用以下命令查找使用摄像头的进程:
lsof /dev/video0
- 如果有输出,说明某个进程正在使用摄像头,记录下进程 ID (PID),然后终止它:
kill -9 <PID>
** 2:重启摄像头模块**
-
禁用并重新启用摄像头模块:
sudo modprobe -r bcm2835-v4l2 sudo modprobe bcm2835-v4l2
-
检查设备是否正常:
ls /dev/video*
** 3:调整显存**
- 打开 GPU 内存配置:
sudo raspi-config
- 选择 Performance Options > GPU Memory。
- 将显存调整为 128 MB 或更高(建议 256 MB,这里不要设置太高,会导致黑屏无法正常显示!!!!!)。
- 重启系统:
sudo reboot
4:测试摄像头模块
使用以下命令测试摄像头是否正常工作:
raspivid -t 5000
这会显示摄像头画面 5 秒钟。如果正常工作,说明硬件无问题。
5. 检查摄像头模块是否启用
确认摄像头模块已启用。使用以下命令检查:
vcgencmd get_camera
输出应该是:
supported=1 detected=1
如果不是,可以通过 raspi-config
工具启用摄像头模块:
sudo raspi-config
然后选择 Interface Options > Camera,启用摄像头,并重启系统。
6. 确保系统没有占用过多的资源
如果树莓派的内存或 CPU 负载过高,也可能导致资源不足。使用以下命令检查系统资源:
top
如果系统负载过高,尝试关闭不必要的进程,释放资源。
总结
- 更新树莓派的固件和软件包。
- 调整 GPU 内存。
- 禁用并重新启用摄像头模块。
- 确保没有进程占用摄像头。
- 检查摄像头是否已启用。
下面附上采集并保存视频的代码
代码示例 1:使用 OpenCV
下面是一个简单的示例,利用 OpenCV 从摄像头读取视频帧并保存为视频文件:
import cv2
# 初始化摄像头(摄像头索引为 0)
cap = cv2.VideoCapture(0)
# 设置视频参数(分辨率和帧率)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_FPS, 30)
# 定义视频编码器和输出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 或者使用 'MJPG'
out = cv2.VideoWriter('output.avi', fourcc, 30, (640, 480))
print("按 'q' 退出并保存视频...")
while True:
ret, frame = cap.read()
if not ret:
print("无法读取摄像头数据!")
break
# 显示视频
cv2.imshow('Video', frame)
# 写入到输出文件
out.write(frame)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
代码示例 2:使用 PiCamera
如果使用的是官方摄像头,也可以使用 picamera
库来捕获视频,个人感觉能用opecv就最好用opencv,迁移方便:
from picamera import PiCamera
from time import sleep
camera = PiCamera()
# 设置分辨率和帧率
camera.resolution = (640, 480)
camera.framerate = 30
# 开始录制并保存到文件
camera.start_recording('video.h264')
print("开始录制,按 Ctrl+C 停止...")
try:
sleep(10) # 录制 10 秒
finally:
camera.stop_recording()
print("录制完成,保存为 video.h264")
注意文件格式转换:
- 如果使用
PiCamera
保存的.h264
文件,可以使用以下命令将其转换为.mp4
格式:
需要安装MP4Box -add video.h264 video.mp4
gpac
工具:sudo apt install gpac