在Linux中从视频流截取图片帧(ffmpeg )

news2024/12/28 4:15:09

Linux依赖说明:

说明: 使用到的 依赖包  

1. ffmpeg

sudo apt update 
sudo apt-get install ffmpeg

2. imagemagick (选装)
(检测图像边缘信息推断清晰度,如果是简单截取但个图像帧=>用不到<=)

sudo apt-get install imagemagick

备注: 
指令及相关参数说明

核心指令: (作用: 执行 ffmpeg 命令提取帧,每10帧选择一帧, 一共提取5张)

示例:

ffmpeg -i “https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4” -vf “select=‘not(mod(n,10))’” -frames:v 5 -q:v 1 output_%03d.jpg

指令说明:

这条 ffmpeg 命令从视频流中提取帧并保存为图片,具体的参数含义如下:

1. ffmpeg -i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4"

  • ffmpeg:调用 ffmpeg 命令。
  • -i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4":指定输入文件,视频源为给定的网络视频 URL。

2. -vf "select='not(mod(n,10))'"

  • -vf:表示使用视频滤镜。

  • "select='not(mod(n,10))'"
    

    :视频帧选择器,这里

    mod(n,10)
    

    表示每 10 帧提取一次帧。

    n
    

    是当前帧的编号,

    mod(n,10)
    

    计算帧编号除以 10 的余数,

    not(mod(n,10))
    

    选择那些编号是 10 的倍数的帧。

    • 换句话说,这条命令每 10 帧提取一个帧。

3. -frames:v 5

  • 只提取 5 帧图片。

4. -q:v 1

  • -q:v 设置视频帧的质量,范围为 1 到 31,值越小质量越高,1 是最高质量。

5. output_%03d.jpg

  • 输出文件名模板。%03d 是一个占位符,表示文件名中包含 3 位数字(例如 output_001.jpgoutput_002.jpg),这样可以保存多个帧。

整体含义:

从视频中每隔 10 帧提取一个帧,总共提取 5 帧,保存为高质量的 JPEG 图片文件,文件名为 output_001.jpg, output_002.jpg, 以此类推。

指令执行完可见当前文件夹中文件:

在这里插入图片描述

具体的命令可根据需求情况进行修改, 到这里文章的标题功能就已经实现了.

下面是加餐环节


需求: 提取视频中的图片帧, 并从多张中选取最清晰的一张照片

注: 其中的文件路径需要改为自己所存在的路径

这里准备了三个脚本文件如下:

  • extract_frames.sh 提取视频帧输出指定张数据照片并存到指定位置 并执行 detect_sharpness.sh 脚本(已注释掉, 需要的话自行打开)
  • detect_sharpness.sh 从多张照片中选择最清晰的一张 并将其余的照片删除, 且保留最清晰一张并重命名
  • create_directory.sh 判断文件夹是否存在, 不存在则创建, 存在则不处理

extract_frames.sh

提取视频帧输出指定张数据照片并存到指定位置 并执行 detect_sharpness.sh 脚本

注: 执行该脚本需要指定—视频路径

示例:

/data/hikuser/handler_video_to_picture/extract_frames.sh  https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4
#!/bin/bash

# 删除指定目录下已有的图片
rm -f /data/hikuser/handler_video_to_picture/output*.jpg

# 检查是否提供了视频流 URL 参数
if [ "$#" -ne 1 ]; then
    echo "Usage: ${0##*/} <video_stream_url>"
    exit 1
fi

# 视频流 URL
VIDEO_URL="$1"

# 检查输出目录是否存在
if [ ! -d "/data/hikuser/handler_video_to_picture" ]; then
    echo "Directory /data/hikuser/handler_video_to_picture does not exist."
    exit 1
fi

# 执行 ffmpeg 命令提取帧,每10帧选择一帧, 一共提取5张
if ! ffmpeg -i "$VIDEO_URL" -vf "select='not(mod(n,10))'" -frames:v 5 -q:v 1 /data/hikuser/handler_video_to_picture/output_%03d.jpg; then
    echo "ffmpeg command failed."
    exit 1
fi

# 执行检测图片清晰度的脚本
# if [ -f /data/hikuser/handler_video_to_picture/detect_sharpness.sh ]; then
#    /bin/bash /data/hikuser/handler_video_to_picture/detect_sharpness.sh
# else
#    echo "detect_sharpness.sh script not found!"
#    exit 1
# fi

detect_sharpness.sh

从多张照片中选择像素最高的一张 并将其余的照片删除, 并将最新的一张重命名

#!/bin/bash

# 初始化最大边缘值和最清晰的图片变量
max_edge_value=0
sharpest_image=""

# 进入图片所在目录
cd /data/hikuser/handler_video_to_picture || exit 1

# 遍历每张图片并计算边缘值
for img in output_*.jpg; do
    # 计算图片的边缘检测值
    edge_value=$(convert "$img" -edge 1 -format "%[mean]" info:)
    echo "$img 边缘检测值: $edge_value"
    
    # 比较边缘值,保留最大值对应的图片
    if (( $(echo "$edge_value > $max_edge_value" | bc -l) )); then
        max_edge_value=$edge_value
        sharpest_image=$img
    fi
done

# 输出最清晰的图片
echo "最清晰的图片是: $sharpest_image"

# 删除其他图片
for img in output_*.jpg; do
    if [ "$img" != "$sharpest_image" ]; then
        rm "$img"
    fi
done

# 将最清晰的图片重命名为 output.jpg
mv "$sharpest_image" /data/hikuser/handler_video_to_picture/output.jpg

echo "已删除其他图片,保留最清晰的图片: $sharpest_image"

脚本执行效果示例:

所以截取的图片大小因为数据源是一个静态视频, 当然如果采集帧率过快时也会出现这样的情况, 注意空值

create_directory.sh

判断文件夹是否存在存在则创建不存在则不处理

#!/bin/bash

# 检查是否提供了文件夹名称参数
if [ "$#" -ne 1 ]; then
    echo "Usage: ${0##*/} <directory_name>"
    exit 1
fi

# 文件夹名称
DIR_NAME="$1"

# 检查文件夹是否存在
if [ -d "$DIR_NAME" ]; then
    echo "Directory '$DIR_NAME' already exists."
else
    # 创建文件夹
    mkdir -p "$DIR_NAME"
    if [ $? -eq 0 ]; then
        echo "Directory '$DIR_NAME' has been created."
    else
        echo "Failed to create directory '$DIR_NAME'."
        exit 1
    fi
fi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker部署rabbitMQ 单机版

获取rabbit镜像&#xff1a;我们选择带有“mangement”的版本&#xff08;包含web管理页面&#xff09;&#xff1b; docker pull rabbitmq:management 创建并运行容器&#xff1a; docker run -d --name rabbitmq -p 5677:5672 -p 15677:15672 rabbitmq:management --name:…

InVEST实践及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中的具体应用

不论您是小白亦或是已经能够成功运行InVEST模型生成结果&#xff0c;您可以自由选择课程内容&#xff0c;如果您是小白老师手把手教您&#xff0c;如果您已经是InVEST模型熟悉者&#xff0c;已经为您准备了结合实际项目内容以及通过模型进行高质量的论文重现&#xff0c;还有很…

Java面试题-基础和框架-Java面试题二

1、什么是抽象类&#xff1f; 在 Java 中&#xff0c;抽象类用于创建具有某些被子类实现的默认方法的类&#xff0c;一个抽象类可以有没有方法体的抽象方法&#xff0c;也可以有和普通类一样有方法体的方法。 abstract 关键字用于声明一个抽象类&#xff0c;抽象类无法实例化…

Docker容器的基础命令操作大全(入门必看)

本指南将带您深入了解Docker的基本操作&#xff0c;包括镜像的管理、容器的创建与删除&#xff0c;以及如何高效地使用Docker进行开发和部署。通过这些内容&#xff0c;您将掌握Docker的核心概念&#xff0c;为未来的项目奠定坚实的基础。让我们一起开启这段探索之旅&#xff0…

安装open-webui报错

通过docker安装open-webui容器一直重启中 提示报错“OpenBLAS blas_thread_init: pthread_create failed for thread 1 of 16: Operation not permitted...” 解决&#xff1a; 在容器启动命令中加上--privilegedtrue

AIAutoPrediction足球数据分析软件工具安装教程(附带操作截图)

文章目录 前言一、AIAutoPrediction是什么&#xff1f;二、AIAutoPrediction能做什么&#xff1f;即时大小球预测即时亚盘预测大小球、亚盘初盘分析 三、安装教程1、软件下载2、打开安装包&#xff0c;进行软件安装3、选择安装目录4、执行安装5、安装完成6、开始使用 总结 前言…

Tomcat服务器安装SSL证书教程

Tomcat服务器安装SSL证书教程&#xff0c;主要包括获取证书、安装证书、重启Tomcat以及测试SSL证书是否安装成功等4大步骤&#xff0c;以下是详细图文教程。 一、获取证书 现在锐成信息申请一张SSL证书&#xff0c;证书申请成功后&#xff0c;会获取到颁发证书文件&#xff0…

队列+宽搜(BFS)

前言 宽搜属于搜索类算法 搜索类算法&#xff1a; 深搜&#xff08;DFS&#xff09;宽搜&#xff08;BFS&#xff09; 宽搜可以解决树、图、最短路径、迷宫、拓扑排序等问题 429. N 叉树的层序遍历 题目链接&#xff1a;429. N 叉树的层序遍历 题目解析 题目意思就是对这个…

ETCD的备份和恢复

一、引言 ETCD是一个高度可用的键值存储系统&#xff0c;被广泛应用于Kubernetes等分布式系统中以存储关键配置数据和服务发现信息。由于ETCD的重要性&#xff0c;确保其数据的安全性和可靠性至关重要。本文将介绍ETCD备份与恢复的基础知识、常用方法及最佳实践。 二、概述 …

Qt绘制动态仪表

背景&#xff1a; 项目需要&#xff0c;可能需要做一些仪表显示。此篇除了介绍实现方法&#xff0c;还要说明心路历程。对我而言&#xff0c;重要的是心理&#xff0c;而不是技术。写下来也是自勉。 本人起初心里是比较抵触的&#xff0c;从业20多年了&#xff0c;深知所谓界…

Linux 中 Tail 命令的 9 个实用示例

引言 我们作为 Linux 用户&#xff0c;经常会操作那些在后台长时间运行的进程&#xff0c;这些进程被称作守护进程或服务。例如 Secure Shell (sshd)、Network Manager (networkd)、Volume Manager (LVM)、Cron 等都是服务的典型例子&#xff0c;这样的服务还有很多。 在许多情…

1.10 DFT示例1

1.10 DFT示例1 Tips&#xff1a;离散傅里叶的不同角度的解释。 参考&#xff1a;https://mp.weixin.qq.com/s/TrRmqkc34Zqw9pgaITqlZg?poc_tokenHF5h1WajXiXCmFpwIbv1HaHN52KsET1UE29CM561 摘取部分核心观点&#xff1a; 站在高观点下看问题&#xff0c;傅里叶变换本质上是…

MySQL表的操作与数据类型

目录 前言 一、表的操作 1.创建一个表 2.查看表的结构 3.修改表 4.删除一个表 二、 MySQL的数据类型 0.数据类型一览&#xff1a; 1.整数类型 2.位类型 3.小数类型 4.字符类型 前言 在MySQL库的操作一文中介绍了有关MySQL库的操作&#xff0c;本节要讲解的是由库管理的结构——…

PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性能

目录 前言PointCNN实现细节1. X X X-Conv 操作输入输出步骤 2. PointCNN 网络架构层级卷积分类与分割任务 3. 数据增强4. 效率优化 前言 这篇论文介绍了一种名为 PointCNN 的方法&#xff0c;旨在从点云&#xff08;point cloud&#xff09;数据中学习特征。传统卷积神经网络…

华为 HCIP-Datacom H12-821 题库 (9)

有需要题库的可以看主页置顶 V群进行学习交流 1.以下关于 RSTP 保护功能的描述&#xff0c;错误的是哪一选项&#xff1f; A、环路保护可以部署在根端口上&#xff0c;以防网络中形成环路 B、环路保护可以部署在Alternate 端口上&#xff0c;以防网络中形成环路 C、BPDU 保…

“短视频 + ”新业态下的高职院校数字媒体技术专业群建设方案

一、引言 短视频&#xff0c;亦称短片视频&#xff0c;是在移动互联网快速普及背景下兴起的一种新兴媒体形态&#xff0c;它继承了传统影视行业的一些特点并加以创新。相较于传统的文字和图片传播方式&#xff0c;短视频集声音与影像于一体&#xff0c;能够承载更多的信息量&a…

【JAVA开源】基于Vue和SpringBoot的网上订餐系统

本文项目编号 T 018 &#xff0c;文末自助获取源码 \color{red}{T018&#xff0c;文末自助获取源码} T018&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

缓存对象反序列化失败

未定义serialVersionUID&#xff0c;会自动生成序列化号 新增了属性&#xff0c;序列号就变了&#xff0c;导致缓存对象反序列化失败。 所有缓存对象必须指定序列化id&#xff01; 那我如何找到未添加字段前 对象的序列化号呢&#xff1f;默认的序列化号是如何生成的呢&#…

11、Hive+Spark数仓环境准备

1、 Hive安装部署 1&#xff09;把hive-3.1.3.tar.gz上传到linux的/opt/software目录下 2&#xff09;解压hive-3.1.3.tar.gz到/opt/module/目录下面 [shuidihadoop102 module]$ tar -zxvf /opt/software/hive-3.1.3.tar.gz -C /opt/module/ 3&#xff09;修改hive-3.1.3-b…

车辆目标检测数据集 19000张 带标注 voc yolo

数据集名称&#xff1a; 车辆目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;19000张标注类型&#xff1a;车辆检测&#xff08;包括但不限于轿车、卡车、公交车、摩托车等&#xff09;格式兼容性&#xff1a;支持VOC和YOLO标注格式 数据集内容&#xff1a; 该…