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