python学opencv|读取视频(一)灰度视频制作和保存

发布于:2024-12-06 ⋅ 阅读:(22) ⋅ 点赞:(0)

【1】引言

上一次课学习了用opencv读取图像,掌握了三个函数:cv.imread()cv.imshow()cv.imwrite()

相关链接如下:

python学opencv|读取图像-CSDN博客

这次课我们继续,来学习用opencv读取视频。

【2】学习资源

首先是官网资源,查看下述代码:

OpenCV: Getting Started with Videos

然后是对应的中文版博客资源,查看下述链接:

2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack

这两个内容基本上是一模一样,所以按照自己的喜好选用即可。

这次课程的学习目的是掌握视频的读取和保存,涉及两个函数:

cv.VideoCapture()cv.VideoWriter()

【3】函数解读

【3.1】cv.VideoCapture()函数

点击下述链接,直达官网解读页面:

https://docs.opencv.org/4.0.0/d8/dfe/classcv_1_1VideoCapture.html

这里的核心意思也很简单:Class for video capturing from video files, image sequences or cameras.

简而言之就是:从视频文件、系列图片或者照相机中读取视频。

【3.2】cv.VideoWrite()函数

点击下述链接,直达官网解读页面:

OpenCV: cv::VideoWriter Class Reference

核心意思:Video writer class.

简而言之就是:保存视频。

【4】 代码解读 

在上述解读的基础上,我们尝试理解代码。

书栈网2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack提供了非常简洁的代码,我们对其解读:

    import numpy as np
    import cv2 as cv
    cap = cv.VideoCapture(0)
    while(True):
        # 一帧一帧捕捉
        ret, frame = cap.read()
        # 我们对帧的操作在这里
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        # 显示返回的每帧
        cv.imshow('frame',gray)
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    # 当所有事完成,释放 VideoCapture 对象
    cap.release()
    cv.destroyAllWindows()

首先是引入计算和opencv模块:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块

然后直接调用cv.VideoCapture()函数读取视频:

cap = cv.VideoCapture(0) #读取视频

之后给了一个自定义函数,这个函数逐帧读取视频,然后把视频变成灰色输出,里面使用了imshow()函数支持输出:

while (True): #自定义函数
    # 一帧一帧捕捉
    ret, frame = cap.read()
    # 我们对帧的操作在这里
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) #将每一帧都换成灰色
    # 显示返回的每帧
    cv.imshow('frame', gray) #输出灰色的视频
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

然后任务完成释放所有对象:

# 当所有事完成,释放 VideoCapture 对象
cap.release() #读取完成后,释放,也就是任务完成后休息
cv.destroyAllWindows() #关闭窗口

实际上运行上述代码没有任何输出,甚至还会保存,因为至少没有视频支持读取。

所以为了完成对代码的理解,还有必要稍加改写。

上次课已经知晓,要被读取的对象最好和python程序放在一起,所以我做了一个视频,和程序放在了同一个位置,视频链接为:

dnlp-aixmls

 然后把代码修改为:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块

cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
while (True): #自定义函数
    # 一帧一帧捕捉
    ret, frame = cap.read()
    # 我们对帧的操作在这里
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) #将每一帧都换成灰色
    # 显示返回的每帧
    cv.imshow('frame', gray) #输出灰色的视频
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 当所有事完成,释放 VideoCapture 对象
cap.release() #读取完成后,释放,也就是任务完成后休息
cv.destroyAllWindows() #关闭窗口

视频按照灰色的模样进行了输出,效果为:

使用python+opencv转化灰度视频

【5】 灰度视频保存

根前述内容,已知使据用cv.VideoWrite()函数可以保存视频

先引入一个翻转视频后再将其保存的示例,示例依然来自:2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块

cap = cv.VideoCapture(0) #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) #输出视频
while (cap.isOpened()): #自定义函数
    ret, frame = cap.read()
    if ret == True:
        frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数
        # 写入已经翻转好的帧
        out.write(frame) #保存视频
        cv.imshow('frame', frame) #输出视频
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

 上面先给出了加了注释的官网示例代码,然后我们很直观的会发现保存视频主要增加了两行汇总要代码:

fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) #输出视频

fourcc用于视频解码,out用于视频保存。

逻辑上也非常简单,先知道了视频的格式,也就是掌握了该如何处理的方法,然后按照期待的方向将其格式和名称进行转化就可以。

不过官网代码还不能直接使用,所以我们稍微修改一下,转化为下述形式:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块

cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output-100.mp4', fourcc, 20.0, (1920, 1040)) #输出视频
while (cap.isOpened()): #自定义函数
    ret, frame = cap.read()
    if ret == True:
        frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数
        # 写入已经翻转好的帧
        out.write(frame) #保存视频
        cv.imshow('frame', frame) #输出视频
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

实际上我们看到这是一个彩色的翻转视频,链接如下。

使用python+opencv翻转视频

结合一下对前面的灰度视频转化的操作,我们尝试保存一下灰度视频。

首先输入下述代码:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块

cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output-flip-gray.mp4', fourcc, 20.0, (1920, 1040),False) #输出视频
while (cap.isOpened()): #自定义函数
    ret, frame = cap.read()
    if ret == True:
        frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        # 写入已经翻转好的帧
        out.write(gray) #保存视频
        cv.imshow('gray', gray) #输出视频
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

这里和之前纯翻转代码的区别是:

acv.VideoWrite()函数后增加了False,正是False参数的出现实现了灰度视频保存;

【b】out.write()和cv.imshow()的参数是gray,它们和False参数一起,保证了保存灰度视频。

【c】修改out.write()和cv.imshow()的参数gray为frame,代码不可以运行。

在v.VideoWrite()函数的官网OpenCV: cv::VideoWriter Class Reference,可以看到解释:

6b730f4245a44b33a344bc7c533b86c2.png

图1

时间也会发现这是一个小细节,只有在cv.VideoWrite()函数后增加了False参数,灰度视频才会被成功保存。

7b69cc5d9d1a4eb985bb4eff84dd8627.png

图2

保存后的翻转灰度视频为:

python+opencv做灰度视频并将其翻转

【6】 总结

初步学习了使用cv.VideoCapture()函数和cv.VideoWrite()函数处理视频的基本技巧。


网站公告

今日签到

点亮在社区的每一天
去签到