FFmpeg在计算机视觉中的应用

计算机视觉任务中,媒体处理非常普遍。预处理任务,包括帧提取、格式转换和质量调整,在图像和视频分析中扮演着关键角色。一个在这些任务中表现出色的工具是FFmpeg。FFmpeg是一个由Fabrice Bellard自2000年以来协同开发的库和程序集合,它被VLC、YouTube和OBS等主要玩家所信赖。从转换视频格式到高效调整图像大小和提取音频,FFmpeg已成为许多多媒体工作流程的首选解决方案。

FFmpeg的安装

要在系统上设置FFmpeg,请首先访问终端。在Linux上,终端应用程序是现成的。对于macOS用户,请在应用程序 > 实用工具文件夹中找到终端应用程序。Windows用户可以选择Windows子系统用于Linux(WSL)或安装像Git Bash这样的Bash终端。

一旦进入终端,请更新软件包列表以确保获得最新版本的FFmpeg。在Ubuntu或Debian系统上,执行以下命令:

sudo apt update

更新后,使用包管理器安装FFmpeg及其依赖项。在Ubuntu或Debian上,请使用以下命令:

sudo apt install ffmpeg

在macOS上,可以使用Homebrew安装FFmpeg:

brew install ffmpeg

要验证安装是否成功,请运行以下命令:

ffmpeg -version

此命令应显示有关最近安装的FFmpeg版本的信息。

FFmpeg在计算机视觉中的应用

视频以各种格式和大小出现,兼容性问题很常见。FFmpeg简化了这一过程。考虑将AVI视频转换为MP4文件。AVI是存储CCTV摄像机镜头的常见文件格式,但许多计算机视觉系统使用MOV或MP4。可以使用以下代码将数据转换为MP4,以便在进一步处理中使用视觉系统(例如,运行目标检测模型):

ffmpeg -i input.avi -c:v libx264 -c:a aac -strict experimental output.mp4

要从MOV转换为MP4,这是另一个常见的转换,可以使用:

ffmpeg -i input.mov -vcodec h264 -acodec mp2 input.mp4

可以使用FFmpeg将视频分割成代表每一帧的图像文件。如果想要将视频分割成帧以用于训练计算机视觉模型,可能需要完成此任务。许多常见的计算机视觉模型(例如,目标检测、分类模型)是在注释图像上训练的,而不是视频。

要将视频分割为帧,请运行:

ffmpeg -i input.mp4 -vf fps=1 output_%04d.png

可以配置使用fps标志获取帧的间隔。在上面的例子中,fps设置为1。这意味着每秒捕获一帧,然后保存到名为output_{frame_number}.png的文件中,其中{frame_number}代表收集的帧。

可以使用Python子进程库与FFmpeg一起将视频分割成用于训练计算机视觉模型的图像文件夹。为此,需要一个Roboflow账户和工作区中的项目。要创建项目,请首先转到Roboflow仪表板。然后,点击“创建项目”。

可以通过Web界面上传视频,也可以通过编程方式上传。如果需要上传大量数据,编程上传是理想的选择。创建一个新的Python文件并添加以下代码:

import os import subprocess from roboflow import Roboflow def video_to_frames(video_path, output_folder): if not os.path.exists(output_folder): os.makedirs(output_folder) command = [ 'ffmpeg', '-i', video_path, os.path.join(output_folder, 'frame_%04d.png') ] subprocess.run(command) def upload_frames_to_roboflow(api_key, workspace_id, project_id, frames_folder): rf = Roboflow(api_key=api_key) print(rf.workspace()) project = rf.workspace(workspace_id).project(project_id) project.upload(frames_folder) if __name__ == "__main__": roboflow_api_key = "my-api-key" roboflow_workspace_id = 'my-workspace' roboflow_project_id = 'my-project-id' video_path = 'input.mp4' frames_folder = 'outputs/' video_to_frames(video_path, frames_folder) upload_frames_to_roboflow(roboflow_api_key, roboflow_workspace_id, roboflow_project_id, frames_folder)

在代码中定义了一个名为`video_to_frames`的函数,该函数使用`ffmpeg`将视频转换为系统命名的PNG帧。`upload_frames_to_roboflow`连接到Roboflow,打印工作区详细信息,访问指定的项目,并上传帧。

在代码中,替换:

  • roboflow_api_key - Roboflow API密钥。
  • roboflow_workspace_id - Roboflow工作区ID。
  • roboflow_project_id - Roboflow项目ID。
  • video_path - 要上传到Roboflow的视频名称。

代码使用video_to_frames将视频转换为帧,并使用upload_frames_to_roboflow将它们上传到指定的Roboflow项目。这种自动化加速了视频到帧的转换及其与Roboflow项目的无缝集成,简化了数据集管理。

运行上述脚本以将图像上传到工作区。图像将出现在Roboflow仪表板的“注释”选项卡上。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485