使用计算机视觉反转视频

资讯 2年前
846

介绍

在本文中,我们将使用[计算机视觉技术开发一个应用程序,该应用程序将反转视频,并且我们将能够将反转的视频保存在我们的本地系统中。在此应用程序中,我们还可以更改其质量,例如 360/720p。

因此,让我们首先了解构建这个应用程序需要做什么。

构建此应用程序的步骤

本节将讨论构建此应用程序需要完成的步骤。在这里,我们将设置模板并在整个教程中遵循此方法。

导入 cv2 库:这是一个非常简单的工作, cv2即 Python 的计算机视觉库。

阅读/捕捉视频:然后,我们将阅读我们想要反转的视频。

使用帧:在本节中,我们将使用视频的帧来获得处理速度,即每秒帧数和帧数。

高度和宽度:在这里,我们将简单地提取我们已阅读的视频的高度和宽度,以便我们可以之后的重新缩放部分中使用它。

重新缩放和设置输出视频的类型:现在,在这一部分中,我们将简单地将视频重新缩放到一定的大小,并设置最后要保存的视频类型。

循环所有内容:最后,我们将所有内容都放入与帧相关的一些条件的循环中,并且我们都准备好反转我们的视频。

原始视频

在进行编码部分之前,我们应该知道我们的原始视频是什么样子的!这样在查看结果的同时,我们可以轻松地比较它们。

本文选择的视频是来自 YouTube 的 ens pack 开场视频,在本文中,我们将只处理这个视频,并使用计算机视觉技术将其反转。

导入库

这里我们只导入计算机视觉库,即cv2。

import cv2

阅读视频实例

这里是我们阅读视频的步骤。首先,让我们看一下代码,然后我们将讨论它。

cap = cv2.VideoCapture('sample2.mp4')

我们使用 cv2 的Video Capture 函数来读取视频。为此,我们用引号括起来的参数中传递视频的路径;请记住一件事,如果视频位于同一文件夹中,则不需要使用完整路径;使用带有扩展名的视频名称。

使用框架

在这个部分中,我们将获取视频所拥有的总帧数,为此,我们将使用FRAME COUNT对象

frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)

因此,在这里,可以在分解函数名称的同时轻松解码函数:

CAP:CapturePROP:PropertyFRAME_COUNT:总帧数

但是我们是否使用最有效的方法来获取每秒的总帧数?

简单的答案是:“是的!”

原因:如果我们使用循环来计数帧并每次递增计数器,那么由于处理时间的原因,这对开发人员和 CPU 来说都是一个耗费精力的过程,但如果我们使用内置方法,那么我们就可以解决这两个问题。

因此,就在我们现在获取视频的总帧数之前,我们将尝试获取每秒帧数 (FPS)。

fps = cap.get(cv2.CAP_PROP_FPS)

如果你有计算总帧数的概念,这将非常容易理解。如果我们分解计算FPS的内置函数,那么我们可以看到以下缩写:

· CAP: Capture

· PROP: Property

· FPS: Frames per second

获取视频的高度和宽度

在这里,我们将计算视频的高度和宽度,以便我们可以根据自己的喜好重新缩放输出视频。

height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)

高度:我们这里使用的内置函数是CAP_PROP_FRAME_HEIGHT,在这里我们可以看到FRAME_HEIGHT会得到每一帧的高度,即完整

频的高度。宽度:同样,FRAME_WIDTH 将用于查找视频的宽度。启动视频的输出写入器

现在我们将首先使用Video Writer, fourcc方法,将 4 个字符的代码赋予输出视频以根据我们的需要压缩帧。

这里我们使用“MJPG”字符代码来压缩帧。它也被称为视频编解码器,我们有多种视频编解码器,如果我们想查看参数列表,我们可以将其作为参数传递给函数,然后可以在 FOURCC 页面上找到。

注意:我们使用的是 MJPG 字符代码,即 motion-jpeg 编解码器。

然后我们简单地将输出视频重新缩放到它们的一半比例,即高度和宽度都减少到 50%。

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

out = cv2.VideoWriter('reversed2.avi', fourcc,fps ,(int(width*0.5), int(height*0.5)))

让我们打印一些结果

1. 总帧数

2. 处理期间的每秒帧数。

print("No. of frames are : {}".format(frames))

print("FPS is :{}".format(fps))

输出:

No. of frames are : 488.0

FPS is :25.0

在这里,我们将检索索引,即视频最后一帧的位置。

frame_index = frames-1

最后一步

让我们将所有内容放在一个循环中以获得结果;在这里,我们将循环执行之前已经完成的所有操作,然后将视频保存在我们的本地系统中

if(cap.isOpened()):

  while(frame_index!=0):

      cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)

      ret, frame = cap.read()

      frame = cv2.resize(frame,(int(width*0.5), int(height*0.5)))

      out.write(frame)

      frame_index = frame_index-1

      if(frame_index%100==0):

         print(frame_index)

out.release()

cap.release()

cv2.destroyAllWindows()

输出:

400.0

300.0

200.0

100.0

0.0

代码分解:

1. 我们先借助opens() 函数检查一下视频的实例是否准备好了

2. 然后我们将使用帧索引读取帧直到视频结束

3. 现在,由于我们想要获得反向视频,我们将当前帧的位置初始化为最后一帧。

4. 可选:现在,如果我们想看实时反向视频,我们可以使用 cv2.imshow('name', frame),但是,

5. 如果我们想在本地系统中下载(写入)视频,那么我们将使用 write 方法,并且在每一步之后,我们将简单地减少帧索引。

6. 最后一步是打印帧值(这只是为了检查进度),然后释放实例并销毁窗口。

输出:

因此,在这里我们可以看到,在我们之前所做的所有计算机视觉操作的帮助下,原始视频已成功反转。

结论

我们已经涵盖了我们之前讨论过的所有步骤,现在我们已经编写(下载)了我们的反转视频,你可以在上面的 YouTube 视频链接中看到。

现在让我们总结一下到目前为止我们学到的东西。

1. 本文的第一个要点是,我们学习了如何 在本地和实时视频中使用帧。

2. 我们还学习了使用内置函数获取视频帧及其处理时间的最佳方法。

3. 然后在预处理后编写视频的同时,我们还注意到一个简单的变换可以给我们正确的输出(这里是反向视频)。

       原文标题 : 使用计算机视觉反转视频

© 版权声明

相关文章