title: cv2读取视频,并保存图像或视频
date: 2022-07-02 18:10:24
tags: opencv

@TOC

cv2读取视频,并保存图像或视频

cv2读取视频的一般流程

  1. 获取视频 cap = cv2.VideoCapture()
  2. 判断获取的视频是否成功,成功读取视频对象则返回True。 cap.isOpened()
  3. 按帧读取 ret, frame = cap.read()
  4. 展示图像 cv2.waitKey(1)

读取本地文件视频并展示

from turtle import color
import numpy as np
import cv2 as cv
import cv2


def read_video_show(videoName):
    '''
    opencv 读取视频

    cv2.VideoCapture(filename) #读取本地视频
    cv2.VideoCapture(index) #获取摄像头
    '''

    #1. 读取视频
    cap = cv2.VideoCapture(videoName) #若参数为0, 则是本地摄像头
    
    #2. 判断读的视频流是否成功
    while cap.isOpened(): #当成功时
        
        #3. 获取每帧图像
        ret, frame = cap.read() #若获取成功,ret为True,否则为False;frame是图像
        
        if ret: #成功获取图像
            cv2.imshow('frame', frame) #两个参数,一个是展示画面的名字,一个是像素内容
            key = cv2.waitKey(25) # 停留25ms,当为0的时候则堵塞在第一帧不会继续下去
            if key == ord(' ') or key == ord('q'): #当键入空格或者q时,则退出while循环
                break

    cap.release() #释放视频
    cv2.destroyAllWindows() #释放所有显示图像的窗口

def read_video_save(videoName):

    '''
    opencv 保存视频

    cv2.VideoWriter(filename, fourcc, fps, frameSize, [isColor])
    '''

    cap = cv2.VideoCapture(videoName)

    #视频属性
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) #获取原视频的宽
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #获取原视频的搞
    fps = int(cap.get(cv2.CAP_PROP_FPS)) #帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC)) #视频的编码

    #视频对象的输出
    out = cv2.VideoWriter('video_output.avi', fourcc, 20.0, (width, height))
    # out = cv2.VideoWriter('out.avi', fourcc, 20.0, (width, height))
    
    while cap.isOpened():
        ret, frame = cap.read()
        cv2.imshow('fame', frame)
        key = cv2.waitKey(25)

        out.write(frame) #写入视频

        if key == ord('q'):
            
            break
    cap.release() #释放视频
    out.release()
    cv2.destroyAllWindows() #释放所有的显示窗口

def read_video_write(videoName):
    '''
    读取视频并保存截帧

    cv2.imwrite(filename, frame)
    '''
    cap = cv2.VideoCapture(videoName)

    #视频属性
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) #获取原视频的宽
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #获取原视频的搞
    fps = int(cap.get(cv2.CAP_PROP_FPS)) #帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC)) #视频的编码

    n, i = 0, 0 #总的帧数,保存的第i张图片
    
    while cap.isOpened():

        ret, frame = cap.read()
        
        if ret:
            n += 1
            if n % fps == 0:
                i += 1
                filename = '{:0>4}.jpg'.format(str(i))
               
                cv2.imwrite(filename, frame) #存入快照
                cv2.imshow('frame', frame)
                key = cv2.waitKey(25)
                if key == ord('q'):
                    break
    cap.release()
    cv2.destroyAllWindows()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐