Python利用VideoCapture读取视频或摄像头并进行保存
lizhuang236 · 121浏览 · 发布于2022-07-01 +关注

这篇文章主要为大家介绍一下OpenCV中cv2.VideoCapture函数的使用,并利用cv2.VideoCapture读取视频或摄像头以及进行保存帧图像或视频,感兴趣的小伙伴可以了解一下

一、语法:cap = cv2.VideoCapture(0)

说明:参数0表示默认为笔记本的内置第一个摄像头,如果需要读取已有的视频则参数改为视频所在路径路径,例如:cap=cv2.VideoCapture('video.mp4')

二、语法:cap.isOpened()

说明:判断视频对象是否成功读取,成功读取视频对象返回True。

三、语法:ret,frame = cap.read()

说明:按帧读取视频,返回值ret是布尔型,正确读取则返回True,读取失败或读取视频结尾则会返回False。frame为每一帧的图像,这里图像是三维矩阵,即frame.shape = (640,480,3),读取的图像为BGR格式。

四、语法:key = cv2.waitKey(1)

说明:等待键盘输入,参数1表示延时1ms切换到下一帧,参数为0表示显示当前帧,相当于暂停。

五、读取摄像头并保存为视频代码演示

import cv2
  
def videocapture():
    cap=cv2.VideoCapture(0)     #生成读取摄像头对象
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  #获取视频的宽度
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  #获取视频的高度
    fps = cap.get(cv2.CAP_PROP_FPS) #获取视频的帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))    #视频的编码
    #定义视频对象输出
    writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))
    while cap.isOpened():
        ret, frame = cap.read() #读取摄像头画面
        cv2.imshow('teswell', frame) #显示画面
        key = cv2.waitKey(24)
        writer.write(frame)  #视频保存
        # 按Q退出
        if key == ord('q'):
            break
    cap.release()         #释放摄像头
    cv2.destroyAllWindows() #释放所有显示图像窗口

if __name__ == '__main__' :

    videocapture()


六、读取视频并按帧进行保存代码演示: 

import numpy as np
import cv2
import os
 
def video2image(video_dir,save_dir):
    cap = cv2.VideoCapture(video_dir) #生成读取视频对象
    n = 1   #计数
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))    #获取视频的宽度
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))   #获取视频的高度
    fps = cap.get(cv2.CAP_PROP_FPS)    #获取视频的帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))    #视频的编码
    # 定义视频输出
    #writer = cv2.VideoWriter("teswellvideo_02_result.mp4", fourcc, fps, (width, height))
    i = 0
    timeF = int(fps)     #视频帧计数间隔频率
    while cap.isOpened():
        ret,frame = cap.read() #按帧读取视频
        #到视频结尾时终止
        if ret is False :
            break
        #每隔timeF帧进行存储操作
        if (n % timeF == 0) :
            i += 1
            print('保存第 %s 张图像' % i)
            save_image_dir = os.path.join(save_dir,'%s.jpg' % i)
            print('save_image_dir: ', save_image_dir)
            cv2.imwrite(save_image_dir,frame) #保存视频帧图像
        n = n + 1
        cv2.waitKey(1) #延时1ms
    cap.release() #释放视频对象
 
#读取文件夹所有视频,每个视频按帧保存图像
def video2image_multi(video_path,save_path):
    video_list = os.listdir(video_path)
    
    for i in range(len(video_list)) :      
        video_dir = os.path.join(video_path,video_list[i])
        cap = cv2.VideoCapture(video_dir)
        fps = cap.get(cv2.CAP_PROP_FPS)     # 视频的帧率
        save_num = 0
        n = 1           #计数
        timeF = int(fps)          # 视频帧计数间隔频率
        while cap.isOpened():
            ret,frame = cap.read()
            if ret is False :
                break
            #每隔timeF帧进行存储操作
            if (n % timeF == 0) :
                save_num += 1
                save_image_dir = os.path.join(save_path,'%s_%s.jpg' % (i,save_num))
                cv2.imwrite(save_image_dir,frame)
            n = n + 1
            cv2.waitKey(1)
        cap.release()
        print('读取第 %s 个视频完成 !!!' % i)
 
if __name__ == '__main__' :
 
    video_to_image(r'E:\AI\video.mp4', r'E:\AI\video2image')



相关推荐

PHP实现部分字符隐藏

沙雕mars · 1117浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 610浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 695浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 791浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 724浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
我目前在一家互联网公司,从事运营工作,地标是南方的深圳,希望可以认识更多的朋友。
分类专栏
小鸟云服务器
扫码进入手机网页