opencv学习笔记02-视频读取与写入

Posted (⊃・ᴥ・)つ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习笔记02-视频读取与写入相关的知识,希望对你有一定的参考价值。

opencv 简易笔记 2

2.视频读取和截取

import cv2

# 窗口命名
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
cv2.resizeWindow("video", 500, 500)
# 读取视频
video = cv2.VideoCapture("mdPNG/3-11 OpenCV中的TrackBar控件.mp4", cv2.CAP_FFMPEG)
# 循环读取视频,延时设置为100ms
videowriter = cv2.VideoWriter(
    "mdPNG/3-11 OpenCV中的TrackBar控件_copy.mp4",
    cv2.VideoWriter_fourcc(*"MJPG"),
    30.0,
    (1920, 1080),
    isColor=False,
)
ret = True
while ret:
    ret, frame = video.read()
    cv2.imshow("video", frame)
    videowriter.write(frame)
    key = cv2.waitKey(1)
    if key & 0xFF == ord("q"):
        break
print(ret)
# 释放videoCapture
video.release()
videowriter.release()
cv2.destroyAllWindows()

2.1 VideoCapture(filename,api)

该方法能够读取到视频,api 无需特别指定,除非有特殊需求:

(1) filename: 文件名,0 为摄像头
(2) api: 通过 cv2.CAP 进行查看

2.2 read()->bool,mat

该方法能够读取视频帧,并有两个返回值,即状态值与当前帧
(1) bool: 状态值,正常状态为 True
(2) mat: 当前帧 mat
Tips: 当进行视频播放时,如果 waitKey 中值过小,导致视频播放速度异常,其实这是因为正常视频一般为每秒 20-25 帧左右,以 24 帧为例,正确的设置应当为 1000/24。关于如何查询原视频的帧数,可以通过 ffplay 来查看:

ffplay yourvideoname.mp4

2.2 release()->bool,mat

该方法能够释放 VideoCapture,无返回值

2.3 videoWriter(filename,fourcc,fps,framesize,iscolor)->videoWriter

该方法能够将数据写入视频,有多个参数,返回一个 videoWriter 对象,使用 write 写入 frame,最后需要释放资源。代码示例:

def create_video(filename, width, height, fps=30):
    fourcc = cv2.VideoWriter_fourcc(*\'MJPG\')
    video = cv2.VideoWriter(filename, fourcc, float(fps), (width, height))
    video = cv2.VideoWriter(filename, fourcc, float(fps), (width, height),True)
    return video

(1) filename: 保存的文件名
(2) fourcc: 编码格式,int

(3) fps: 帧率,double
(4) framesize: 宽高,格式为 size
(5) iscolor: 是否为彩色,默认为 True,最好不要操作,容易出错

OpenCV学习笔记2基础:读取播放保存视频

使用 OpenCV 也可以非常方便地读取、播放、保存视频,下面分别介绍。

1. 读取摄像头

VideoCapture 类用于从视频、图像序列、摄像头获取输入。先看如何读取摄像头输入:

import cv2

capture = cv2.VideoCapture(0) # 创建一个视频捕获对象,参数为摄像头编号

print('width = ', capture.get(3), ' height = ', capture.get(4)) # 查看摄像头参数

while True:
    ret, frame = capture.read() # 读取一帧,ret表示是否读取成功
    cv2.imshow('video 0', frame) # 显示一帧

    if cv2.waitKey(1) == ord('q'): # 等待1毫秒,检测到Q键按下则退出
        break

构造函数:cv.VideoCapture(index[, apiPreference])

第一个参数是摄像头的设备号,一般默认为 0 ,即第一个摄像头,如果有多个摄像头,可以设为 1、2、3 等等。

第二个参数指定用于读取视频的后端API,如 cv::CAP_FFMPEGcv::CAP_IMAGEScv::CAP_DSHOW(参考 VideoCaptureAPIs)。

2. 读取视频

读取视频文件例子:

import cv2

capture = cv2.VideoCapture('test.mp4')

while capture.isOpened():
    ret, frame = capture.read()
    cv2.imshow('test video', frame)
    if cv2.waitKey(1) == ord('q'):
        break

构造函数:cv.VideoCapture(filename[, apiPreference])

第一个参数是文件名,可以是如下几类:

  • 视频文件名 (如 video.avi)
  • 图像序列模式串 (如 img_%02d.jpg, 会依次读取img_00.jpg, img_01.jpg, img_02.jpg, …)
  • 视频流URL (如 protocol://host:port/script_name?script_params|auth)
  • GStreamer pipeline string in gst-launch tool format in case if GStreamer is used as backend

前两种较简单,后两种可自己尝试。第二个参数用于指定读取视频的后端API。

3. 保存视频

VideoWriter 类用于保存视频。把摄像头输入保存为视频文件的例子:

import cv2

capture = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
output = cv2.VideoWriter('videos/output.avi', fourcc, 30, (640, 480))

while True:
    ret, frame = capture.read()
    if ret:
        output.write(frame)
        cv2.imshow('camera', frame)
        if cv2.waitKey(1) == ord('q'):
            break
    else:
        break

VideoWriter_fourcc 函数用于通过字符创建 fourcc 码,该编码用于指示一个视频的编码压缩格式等信息。什么是 fourcc 码可以参考:What is a FOURCC?

VideoWriter 是一个用于写视频的类。第一个参数是文件名, 第二个参数是 fourcc 码,第三个参数为帧率,第四个参数为视频大小。


References

  1. OpenCV: cv::VideoCapture Class Reference
  2. OpenCV: cv::VideoWriter Class Reference
  3. What is a FOURCC?
  4. Opencv中FOURCC详解_持久决心的博客-CSDN博客
  5. Video Codecs by FOURCC - fourcc.org
  6. Getting Started with Videos

QQ交流群:点击链接加入群聊【Python练习生】532232743
我的知乎:AXin啊
公众号:请叫我AXin
在这里插入图片描述

以上是关于opencv学习笔记02-视频读取与写入的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV学习笔记2基础:读取播放保存视频

OpenCV学习笔记2基础:读取播放保存视频

OpenCV学习笔记2基础:读取播放保存视频

OpenCV学习笔记2基础:读取播放保存视频

OPENCV学习笔记1-9_视频读取

OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频