Python-OpenCV基础篇学习笔记(2)

Python-OpenCV基础篇笔记之二

  • 视频文件的读取与显示
    • cv2.VideoCapture()
  • 摄像头资源的调用

视频文件的读取与显示

我们知道视频就是由连续的图片按照某种顺序播放形成的,虽然其本质是一张张图片但cv2.imread()却无法直接读取视频文件,需要由专门的视频读取函数进行视频数据的读取并将每一帧图像保存到Mat类矩阵中,所以我们今天要学习关于视频函数使用方法。
首先介绍一个构造视频流的函数,之后我们的读取与显示都与其相关。

cv2.VideoCapture()

该函数创建了一个能够读取与处理视频文件的视频流。cv2.VideoCapture 视频抽帧,使视频图像化,当参数为视频类文件的时候将该文件读取进入到视频流中。
具体操作代码如下:

import cv2
cap = cv2.VideoCapture(r'WeChat_20221107183616.mp4')
while True:
    ret, frame = cap.read()  # ret返回是否获取帧,为布尔值;frame返回该帧的图像数据
    if ret:
        cv2.waitKey(33)  # 等待33毫秒
        cv2.imshow('frame', frame)
    else:
        break

显示效果如下所示:
Python-OpenCV基础篇学习笔记(2)_第1张图片
图片仅学习使用,侵权联系删。

同时cv2.VideoCapture提供了可以查看视频属性的get()函数,通过输入指定的标志来获取视频属性,例如视频的像素尺寸、帧数、帧率等。VideoCapture类中的get()方法中常用的标志和含义在下表中给出。

参数标志 作用
cv2.CAP_PROP_POS_MSEC 视频文件的当前位置(以毫秒为单位)
cv2.CAP_PROP_FRAME_WIDTH 视频流中的像素宽度
cv2.CAP_PROP_FRAME_HEIGHT 视频流中的像素高度
cv2.CAP_PROP_FPS 视频流中图像的帧率(每秒的帧数)
cv2.CAP_PROP_FOURCC 编码器的4字符代码
cv2.CAP_PROP_FRAME_COUNT 视频流中的帧数
cv2.CAP_PROP_FORMAT 返回Mat对象的格式
演示代码如下图所示:
import cv2
cap = cv2.VideoCapture(r'D:\pythonProject1\OpenCV从入门到精通\WeChat_20221107183616.mp4')
while True:
    ret, frame = cap.read()
    if ret:
        cv2.waitKey(33)
        cv2.imshow('frame', frame)
        a = cap.get(cv2.CAP_PROP_POS_MSEC)  # 获取的时间以毫秒为单位
        print(f'图像进度{a / 1000}s')
        b = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
        print(f'图像宽度:{b}')
        c = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
        print(f'图像的高度:{c}')
        d = cap.get(cv2.CAP_PROP_FPS)
        print(f'图像的帧率:{d}')
        e = cap.get(cv2.CAP_PROP_FOURCC)
        print(f'编解码器的四字符代码:{e}')
        f = cap.get(cv2.CAP_PROP_FRAME_COUNT)
        print(f'图像的帧数:{f}')
        g = cap.get(cv2.CAP_PROP_FORMAT)
        print(f'返回mat对象的格式:{g}')
    else:
        break

输出结果如下:

Python-OpenCV基础篇学习笔记(2)_第2张图片
这里的帧数为每秒三十张,所以我们要想显示的视频以正常的速度播放的话就需要写入等待函数,等待的时间为:1 / 30 = 0.033s,将其化为毫秒为33ms,故我们在写代码时加上了waitKey(33)。

摄像头资源的调用

视频文件的读取函数同时也是摄像头调用参数,当参数不为文件路径时而是0时调用电脑自带的摄像头,为1时调用外接摄像头资源然后将摄像头,获取的视频抽成一帧一帧的图像显示出来。

操作代码如下:

h = cv2.VideoCapture(0)

while True:
    ret, frame = h.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按下q退出
        break

我们不难看出对视频文件的读取和对摄像头资源的调用都是将获取到的视频传入到视频流中,然后在视频流中将每一帧图像进行处理显示出来。

你可能感兴趣的:(opencv,python,学习)