在树莓派上使用自带的摄像头采集视频

需要安装的 Python 包

  1. OpenCV:用于处理图像和视频。
  2. PiCamera (可选):如果你使用的是官方的 Raspberry Pi Camera Module,可以通过 opencv 直接访问,也可以安装 picamera 库用于更深层次的控制。
安装步骤

先确认摄像头模块已经启用:

  1. 在终端中运行:

    bash 复制代码
    sudo raspi-config
  2. 在菜单中找到 Interface Options ,选择 Camera,并启用。

  3. 重启树莓派:

    bash 复制代码
    sudo reboot

然后安装好需要的库,可以参考:
树莓派--OpenCV安装踩坑
树莓派明明安装了opencv和numpy,却找不到


测试摄像头状态

bash 复制代码
ls /dev/video*  

如果有 video0 就说明摄像头没有问题


如果读取不到摄像头,可能原因

  1. 摄像头被其他进程占用

    • 如果其他程序(例如 raspividmotion 或 OpenCV)正在使用摄像头,picamera 库将无法初始化连接。
  2. 摄像头配置不正确

    • 树莓派的摄像头模块可能未正确启用或初始化。
  3. 设备节点冲突

    • 如果有多个视频设备,系统可能尝试分配错误的设备节点。
  4. 显存不足

    • 树莓派的 GPU 内存分配不足,无法满足 picamera 的需求。

解决方法

** 1:检查摄像头是否被占用**
  1. 使用以下命令查找使用摄像头的进程:

    bash 复制代码
    lsof /dev/video0
  2. 如果有输出,说明某个进程正在使用摄像头,记录下进程 ID (PID),然后终止它:

    bash 复制代码
    kill -9 <PID>

** 2:重启摄像头模块**
  1. 禁用并重新启用摄像头模块:

    bash 复制代码
    sudo modprobe -r bcm2835-v4l2
    sudo modprobe bcm2835-v4l2
  2. 检查设备是否正常:

    bash 复制代码
    ls /dev/video*

** 3:调整显存**
  1. 打开 GPU 内存配置:

    bash 复制代码
    sudo raspi-config
  2. 选择 Performance Options > GPU Memory

  3. 将显存调整为 128 MB 或更高(建议 256 MB,这里不要设置太高,会导致黑屏无法正常显示!!!!!)。

  4. 重启系统:

    bash 复制代码
    sudo reboot

4:测试摄像头模块

使用以下命令测试摄像头是否正常工作:

bash 复制代码
raspivid -t 5000

这会显示摄像头画面 5 秒钟。如果正常工作,说明硬件无问题。


5. 检查摄像头模块是否启用

确认摄像头模块已启用。使用以下命令检查:

bash 复制代码
vcgencmd get_camera

输出应该是:

bash 复制代码
supported=1 detected=1

如果不是,可以通过 raspi-config 工具启用摄像头模块:

bash 复制代码
sudo raspi-config

然后选择 Interface Options > Camera,启用摄像头,并重启系统。

6. 确保系统没有占用过多的资源

如果树莓派的内存或 CPU 负载过高,也可能导致资源不足。使用以下命令检查系统资源:

bash 复制代码
top

如果系统负载过高,尝试关闭不必要的进程,释放资源。


总结

  1. 更新树莓派的固件和软件包。
  2. 调整 GPU 内存。
  3. 禁用并重新启用摄像头模块。
  4. 确保没有进程占用摄像头。
  5. 检查摄像头是否已启用。

下面附上采集并保存视频的代码

代码示例 1:使用 OpenCV

下面是一个简单的示例,利用 OpenCV 从摄像头读取视频帧并保存为视频文件:

python 复制代码
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,迁移方便:

python 复制代码
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 格式:

    bash 复制代码
    MP4Box -add video.h264 video.mp4

    需要安装 gpac 工具:

    bash 复制代码
    sudo apt install gpac
相关推荐
用户2519162427119 小时前
Python之语言特点
python
刘立军10 小时前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
数据智能老司机13 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机14 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
c8i16 小时前
django中的FBV 和 CBV
python·django
c8i16 小时前
python中的闭包和装饰器
python
这里有鱼汤19 小时前
小白必看:QMT里的miniQMT入门教程
后端·python
TF男孩1 天前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
该用户已不存在1 天前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
站大爷IP1 天前
Java调用Python的5种实用方案:从简单到进阶的全场景解析
python