视频处理
在本演示中,让我们看看您可以使用Engee对视频做些什么。 要做到这一点,让我们从互联网上拍摄的视频剪辑工作。 视频如下。
<iframe宽度="760"高度="415"src="https://www.youtube.com/embed/DLuqZoGNBlo?si=3g411pC4A0Qi2ORh">
In [ ]:
Pkg.add(["VideoIO", "StackViews", "ImageFiltering", "ImageShow"])
In [ ]:
Pkg.add("VideoIO") # Библиотека обработки видеопотока
In [ ]:
using VideoIO # Библиотека обработки видео
using ImageShow # Библиотека отрисовки изображений
using StackViews # Библиотека обработки множеств
using ImageFiltering # Библиотека фильтрации изображений
接下来,使用VideoIO。load函数,我们将文件名作为图像数组的向量加载到内存中。 并使用StackView,我们将执行向量转换为多维矩阵。
In [ ]:
path = @__DIR__ # Возвращает путь до папки открытой в файловом менеджере
path_video = "$path/input.mp4"
Out[0]:
In [ ]:
vid = VideoIO.load( path_video )
Stack = StackView(vid)# Сборка вектора изображений в матрицу
simshow(Stack[:,:,1])# Отрисовка первого кадра видео
Out[0]:
从得到的矩阵中,我们可以计算帧速率,知道视频的时间和视频中的帧数。
Get_time_duration函数返回开始日期和时间,以及视频文件的持续时间。 请注意:如果缺少日期和时间,则函数返回1970年1月1日00:00。
我们还可以使用图像堆栈的size函数找出帧的尺寸及其数量。
In [ ]:
get_time = VideoIO.get_time_duration(path_video)
Out[0]:
In [ ]:
print("All size video: " * string(size(Stack)))
In [ ]:
print("FPS: " * string(size(Stack,3)/floor(get_time[2])))
让我们裁剪视频,只留下它的中心部分。
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]:
现在,对于裁剪视频的前100帧,添加过滤以创建模糊效果。
In [ ]:
for i in 1:100
new_video[:,:,i] = imfilter(new_video[:,:,i], Kernel.gaussian(3))
end
simshow(new_video[:,:,1])# Отрисовка первого кадра видео
Out[0]:
如果我们想将我们的数据保存在视频中,那么有一个选项可以直接以视频文件的形式保存图像堆栈。 与此同时,我们可以独立调整编码器参数和帧速率。 可用设置列表如下表所示。
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
| /目标 | 编码器/ |
|---|---|
| /感知压缩,默认为h264。 大多数情况下的最佳解决方案/(crf=23,preset="medium") | |
| 无损压缩。 最快,最大的文件大小 | (crf=0,预设="超快") |
| 无损压缩。 最慢,最小文件大小/(crf=0,preset="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中进行视频处理的可能性,并使用了说明性的例子来确保环境能够成功地与视频一起工作。 该技术与图像处理相同。


