• 用树莓派USB摄像头做个监控


    【前言】

    看着阴暗的角落里吃灰噎到嗓子眼的树莓派,一起陪伴的时光历历在目,往事逐渐涌上心头,每每触及此处,内心总会升腾起阵阵怜悯之情...

    我这有两个设备,一个是积灰已久的树莓派,另一个是积灰已久的USB摄像头。

    我们今天用这两个设备做一个拍摄监控方案(非视频录制),然后将拍摄好的图片合成视频进行观看。

    主要用到的技术有:树莓派/linux操作,crontab,python,ffmpeg。

    【系列目录】

    1. 树莓派驱动usb摄像头(非官方摄像头模块)
    2. 树莓派加载外接USB硬盘
    3. 树莓派拍摄获取素材程序
    4. 树莓派定时任务编写
    5. 将素材图片合成视频

    【实现过程】

    树莓派驱动usb摄像头(非官方摄像头模块)

    首先我们要保证树莓派可以识别usb摄像头设备,使用命令:

    lsusb
    

    image

    可以看到usb设备列表第一个即 海康威视1080p usb摄像头,说明我们的摄像头设备被正确识别,如果无法识别,则要排除设备故障或想办法安装设备驱动程序。

    我们使用fswebcam应用来驱动usb摄像头模块

    sudo apt-get install fswebcam
    sudo apt-get install mplayer
    

    简单输入拍照命令测试下

    fswebcam -r 1920*1080 --delay 3 --skip 10 1.jpg
    

    image

    image

    我们把树莓派上的 1.jpg 下载下来进行查看,成功拍摄到了画面!

    image

    我们在使用fswebcam时,增加了几个参数,下面介绍这几个参数的作用:

    参数作用
    -r 1920*1080 拍摄图片分辨率
    --delay 3 延时3s后拍摄(给摄像头自动对焦的时间,否则会模糊,这个经常拍照的可以理解吧)
    --skip 10 作用同上,拍摄时其实会拍摄好多帧,我们跳过前10帧以保证清晰度

    树莓派加载外接USB硬盘

    我们计划编写一个程序来长时间捕捉摄像头画面,那么就需要一个比较大的存储空间来存放我们拍摄的图片,我们从小角落找到一个同样“积灰已久”的固态硬盘。

    windows下使用过的硬盘,推荐格式化成FAT32格式,该格式是兼容Linux系统文件格式的,NTFS格式兼容性不是特别好,可能读写会出问题。

    当然直接用linux fdisk命令格式化成 ext2/3/4 也是可以的,但是后续在windows环境下读写又是新问题,如果硬盘不是准备永久挂载在linux系统下使用,还是建议用FAT32格式使用。

    windows10/11 下已经不提供格式成 FAT32 的入口,我们可以下载奥梅分区助手快速格式化成想要的格式。

    使用命令查看固态硬盘是否被识别

    lsusb
    

    image

    可以看到,第二个usb设备便是我们的usb固态硬盘设备了(M.2硬盘放到了USB硬盘盒进行外接)

    使用 fdisk 命令查看硬盘属性

    fdisk -l
    

    image

    使用 mount 挂载硬盘设备,将磁盘挂载到 /mnt/sda1 路径下

    虽然网上有很多教程说配置一个配置文件(具体配置我就不说了),然后让设备开机自动挂载,但我个人极不推荐,修改配置文件开机自动挂载虽然貌似一劳永逸,但在硬盘设备发生变更时,大概率因为忘记同步修改配置文件,会造成无法启动系统的严重故障,折腾不说还可能需要重装系统解决...其实启动不频繁情况下,手动装载也不费事。

    mount /dev/sda3 /mnt/sda1
    

    然后使用 df 命令查看存储占用详情

    df
    

    image

    可以看到硬盘成功挂载。

    树莓派拍摄获取素材程序

    我们编写一个短小的python脚本来实现以下几点小功能:

    • 据时间归档目录
    • 调用api执行拍照,并按时间戳命名
    import os
    import time
    
    if __name__ == '__main__':
        path = '/mnt/sda1'
        # path = 'E:\code\Project.Python\CameraShoot'
        folder = f'{path}/{time.strftime("%Y%m%d")}'
    
        if not os.path.exists(folder):
            os.mkdir(folder)
    
        # 拍照
        os.system(
            f'fswebcam -r 1920*1080 --delay 3 --skip 10 {folder}/{time.strftime("%Y%m%d%H%M%S")}.jpg'
        )
    

    树莓派定时任务编写

    我们使用 linux 环境下的 crontab 编写定时任务,来定时执行拍照任务(初步定每分钟拍一张)

    crontab -e
    * * * * * python /7tiny/camera_shoot.py
    

    采用定时任务,每分钟自动调度执行我们写好的python脚本,来进行拍照任务的执行

    等待一段时间后,便可拿到拍摄素材...

    image

    image

    将素材图片合成视频

    我们先简单从树莓派上下载下来拍摄好的图片,在 windows 上简单合成一个视频,完成我们的任务目标,后期可以根据需要在树莓派上自动合成。

    我们用 ffmpeg 软件将图片合成为视频。

    首先下载 ffmpeg 软件的 exe 版本(windows),linux上可直接下载linux版。

    然后将解压后 ffmpeg 的 exe 目录添加到环境变量,方便我们执行命令。

    将树莓派上的图片下载下来。

    image

    下载下来的图片我们是默认使用时间戳来命名图片的,因为ffmpeg只能从 0 - n 顺序识别图片,无法识别时间戳这种命名,因此,我这里自己编写了一个工具将图片名称替换成了 0 - n.jpg。

    有需要的同学可以在文末获取到工具源码及下载地址。

    重命名好后,我们执行命令压缩图片为 mp4 文件。

    ffmpeg -r 10 -f image2 -i %d.jpg -vcodec libx264 -pix_fmt yuv420p out.mp4
    

    同样我们介绍下使用的几个参数:

    参数作用
    -r 10 视频为每秒10帧,可以根据需要调整,10帧就是10张图片
    %d 从0开始在当前目录递增寻找图片
    -vcodec libx264(windows兼容)  
    -vcodec libx265(体积更小,windows默认不支持) 视频压缩参数
    -pix_fmt yuv420p 视频编码格式(windows下播放兼容)

    执行后,我们便可查看到图片被拼接成为 mp4 格式的视频。

    image

    image

    【总结】

    本文通过短小的代码片段初步使用树莓派+usb摄像头进行环境捕捉,在此基础上,可以进行很多额外的场景扩展及使用优化。

    【源码地址】

    重命名工具源码及编译后绿色程序:
    https://github.com/sevenTiny/SevenTinyToolBox/blob/main/tools/SevenTinyToolBox.RenameWithNumber.exe

    出处:https://www.cnblogs.com/7tiny/p/16325712.html

  • 相关阅读:
    activity 之间传递参数
    手动创建一个Activity,完成页面跳转(intent 无参数)
    C++中汉字字符串的截取
    android基础知识清单。
    更改远程仓库
    设计模式六大原则
    事件订阅代码
    Python Mac ssl.SSLError certificate verify failed (_ssl.c:833)
    Python库中常见的 __all__ 变量是干啥的
    Thrift的使用-Python
  • 原文地址:https://www.cnblogs.com/mq0036/p/16334808.html
Copyright © 2020-2023  润新知