Engee 文档
Notebook

视频处理

在本演示中,我们将了解如何使用Engee处理视频。为此,我们将使用从互联网上截取的视频片段。视频如下所示。

In [ ]:
Pkg.add(["VideoIO", "StackViews", "ImageFiltering", "ImageShow"])
In [ ]:
Pkg.add("VideoIO") # Библиотека обработки видеопотока
   Resolving package versions...
  No Changes to `/user/.project/Project.toml`
  No Changes to `/user/.project/Manifest.toml`
In [ ]:
using VideoIO # Библиотека обработки видео
using ImageShow # Библиотека отрисовки изображений
using StackViews # Библиотека обработки множеств
using ImageFiltering # Библиотека фильтрации изображений

接下来,我们使用 VideoIO.load 函数,将文件名作为图像数组的矢量加载到内存中。然后,我们将使用 StackView 将矢量转换为多维矩阵。

In [ ]:
path = @__DIR__ # Возвращает путь до папки открытой в файловом менеджере
path_video = "$path/input.mp4"
Out[0]:
"/user/start/examples/image_processing/video_processing/input.mp4"
In [ ]:
vid = VideoIO.load( path_video )
Stack = StackView(vid)# Сборка вектора изображений в матрицу
simshow(Stack[:,:,1])# Отрисовка первого кадра видео
Out[0]:
No description has been provided for this image

从得到的矩阵中,我们可以通过了解视频时间和视频帧数来计算帧频。

函数 get_time_duration 返回开始日期和时间,以及视频文件的持续时间。注意:如果缺少日期和时间,函数将返回 00:00 1970 年 1 月 1 日

我们还可以使用size函数找出图像堆栈的帧大小和帧数。

In [ ]:
get_time = VideoIO.get_time_duration(path_video)
Out[0]:
(DateTime("1970-01-01T00:00:00"), 6.016)
In [ ]:
print("All size video: " * string(size(Stack)))
All size video: (720, 1280, 180)
In [ ]:
print("FPS: " * string(size(Stack,3)/floor(get_time[2])))
FPS: 30.0

让我们裁剪视频,只留下中间部分。

In [ ]:
new_video = Stack[1:360,1:640,:]

for i in 1:size(Stack,3)
new_video[:,:,i] = Stack[180:180+359,320:320+639,i]
end

simshow(new_video[:,:,1])# Отрисовка первого кадра видео
Out[0]:
No description has been provided for this image

现在为裁剪后视频的前 100 帧添加滤镜,以创建模糊效果。

In [ ]:
for i in 1:100
new_video[:,:,i] = imfilter(new_video[:,:,i], Kernel.gaussian(3))
end

simshow(new_video[:,:,1])# Отрисовка первого кадра видео
Out[0]:
No description has been provided for this image

如果我们想将数据保存在视频中,可以选择以视频文件的形式直接保存图像堆栈。在这种情况下,我们可以独立调整编码器参数和帧频。可用设置列表如下表所示。

In [ ]:
video = [zeros(eltype(new_video), size(new_video, 1), size(new_video, 2)) for _ in axes(new_video, 3)]

@inbounds for k in axes(new_video, 3)
       video[k] = new_video[:,:,k]
end

| target | encoder_options | 编码器选项 | ----------- | ----------- | | 感知压缩,默认为 h264。大多数情况下的最佳解决方案 | (crf=23, preset="medium") | | 无损压缩。 | 无损压缩。最快,文件尺寸最大 | (crf=0, 预设值="ultrafast") | | 无损压缩。 | 无损压缩。最慢,文件尺寸最小 | (crf=0, 预设值="veryslow") | | | | 直接控制比特率和帧内速率(bit_rate = 400000, gop_size = 10, max_b_frames = 1)

In [ ]:
encoder_options = (crf=23, preset="medium")
VideoIO.save("video.mp4", video, framerate=30, encoder_options=encoder_options)
In [ ]:
 

输出

在本演示中,我们了解了Engee的视频处理功能,并看到了该环境如何成功处理视频。方法与图像处理相同。