使用计算机视觉反转视频


    介绍
    在本文中,我们将使用[计算机视觉技术开发一个应用程序,该应用程序将反转视频,并且我们将能够将反转的视频保存在我们的本地系统中。在此应用程序中,我们还可以更改其质量,例如 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. 然后在预处理后编写视频的同时,我们还注意到一个简单的变换可以给我们正确的输出(这里是反向视频)。