网络编程
位置:首页>> 网络编程>> Python编程>> Python利用VideoCapture读取视频或摄像头并进行保存

Python利用VideoCapture读取视频或摄像头并进行保存

作者:AI算法联盟  发布时间:2022-12-06 18:26:27 

标签:Python,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')

来源:https://blog.csdn.net/weixin_40922285/article/details/102967331

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com