OpenCV-Python学习之路-2:Getting Started with Videos(处理视频)

文章目录

    • 参考依据
    • 目标
    • 1. 从摄像头捕捉实时数据
    • 2. 读取视频文件
    • 3. 保存视频文件

参考依据

参考OpenCV-Python官方文档:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html

目标

  1. 学会去读取视频、展示视频以及保存视频

  2. 从摄像头捕捉视频图像并展示

  3. 学习cv2.VideoCapture(),cv2.VideoWriter()的用法

1. 从摄像头捕捉实时数据

通常,我们需要通过摄像头实时捕捉视频流数据,OpenCV提供了非常简单的接口。首先需要创建一个VideoCapture对象,它的参数是视频文件的名字或者设备索引。设备索引就是用来指定摄像头的数字。然后你可以逐帧地获取到数据,最后要记得释放Capture。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)    ## 因为我用的笔记本自带的摄像头 只有一个

while(True):
    # 逐帧地获取数据
    ret, frame = cap.read()
    # 在frame上进行操作
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 展示结果
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):     # 按下q就退出
        break
        
# 释放capture
cap.release()
cv2.destroyAllWindows()

OpenCV-Python学习之路-2:Getting Started with Videos(处理视频)_第1张图片
说明:
当代码报错的时候,可以用cap.isOpened()来判断是否初始化成功,如果成功就会返回True,如果返回False,使用cap.Open()来初始化。

可以通过cap.get(propld)来获取到一些视频的属性,propld是0-18之间的数字,每个数字表示一个属性,这里贴上一张对应图,有需要的可以看一下。
OpenCV-Python学习之路-2:Getting Started with Videos(处理视频)_第2张图片
例如,可以通过 cap.get(3)和cap.get(4)来得到每一帧的宽、高,然后可以通过ret = cap.set(3, 300),ret = cap.set(4, 300)修改其宽高为300x300。

2. 读取视频文件

和上面的获取实时视频数据一样,主要区别就是将设备索引(device index)改为视频文件名。使用cv2.waitKey()来设置合适的展示时间,如果数值太小将会播放得非常快,如果太大将会播放地非常慢,正常情况下设置25就可以了。

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

while(True):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):   # 我设置为1 相当于开了快进
        break

cap.release()
cv2.destroyAllWindows()

OpenCV-Python学习之路-2:Getting Started with Videos(处理视频)_第3张图片

3. 保存视频文件

我们捕获到了视频,并且做了相应的处理,现在就需要把它保存下来,跟图像的保存不一样,无法简单地使用cv2.imwrite()。

首先我们应该创建一个VideoWrite对象,指明文件名以及FourCC编码,每秒应该传递的帧率(fps),以及保存的帧尺寸,还可以设置一个isColor的标签(如果为True,使用彩色编码器,否则使用灰度)[仅在Windows系统上支持]。

FourCC是指定一个四字节的视频编码器,一般遵循:

  • In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. MJPG results in high size video. X264 gives very small size video)
  • In Windows: DIVX (More to be tested and added)

FourCC通过 cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) 或者cv2.VideoWriter_fourcc(* 'MJPG) 来定义。 (以MJPG为例)

cap = cv2.VideoCapture(0)
w = int(cap.get(3))
h = int(cap.get(4))
fps = cap.get(5)
## 定义编码器以及VideoWrite
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('output.avi', fourcc, fps,(w, h))

while(cap.isOpened()):
    ret, frame = cap.read()
    # 做一个水平垂直翻转
    frame = cv2.flip(frame, -1) 
    cv2.imshow('frame', frame)
    out.write(frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

你可能感兴趣的:(学点工具,opencv,python)