python(二)进阶之cv2读取视频文件或摄像头,并进行保存帧图像或视频

版本

# 4.5.1
python
import cv2
cv2.__version__

函数

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

# 判断视频对象是否成功读取,成功读取视频对象返回true
# 判断载入的视频是否可以打开
cap.isOpened()

# 按帧读取视频,返回值ret是布尔型,正确读取则返回true,读取失败或未读取到视频结尾返回false
# frame 为每一帧的图像,这里图像是三维矩阵,即frame.shape = (640,480,3),
# 读取的图像为BGR格式
ret,frame = cap.read()

# 等待键盘输入,参数1表示延时1ms切换到下一帧,参数为0表示显示当前帧,相当于暂停
key = cv2.waitKey(1)

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

from cv2 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) #显示画面
        # 延时,如果设置很大值得话就会一卡一卡那样
        # 1秒24帧,感觉和这个有关系
        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')

cap.get() cap.set()

当代码报错时,可以使用cap.isOpened()来检查是否成功初始化了,返回值是True,就没有问题,否则就要使用cap.open()

可以使用cap.get(propId)来获取视频的一些参数信息。propId可以是0到18之间的任何数,每一个数代表一个属性,自己可以尝试一下。

其中一些值可以使用cap.set(propId,value)来修改,例如cap.get(3)和cap.get(4)来查看每一帧的宽和高,默认是640x480。我们可以使用ret=cap.set(3,320)和ret = cap.set(4,240)来把宽和高改成320x240。

int propID -----这个参数指定你要更改的属性。这个参数有很多可选项,这里列出一部分。

# 视频的当前位置(毫秒)
CV_CAP_PROP_POS_MSEC

# 视频的当前位置(帧)
CV_CAP_PROP_POS_FRAMES

# 视频流的宽度
CV_CAP_PROP_FRAME_WIDTH

# 视频流的高度
CV_CAP_PROP_FRAME_HEIGHT

# 帧速率(帧/秒)
CV_CAP_PROP_FPS

# 编码器的四字符编码
CV_CAP_PROP_FOURCC

# 获取重定向地址
setopt(pycurl.FOLLOWLOCATION, 1)

问题

non-existing SPS 0 referenced in buffering period

网上找到的原因是下面这个

这个是因为你前面放进去解的一些帧并没有送SPS和PPS. 为什么没有送SPS和PPS呢,一个原因就是解码速度快于接收速度。例如开线程去解码了。

在我自己爬虫的项目中具体表现是,文件只有4k左右,因为是直播,根据链接下载的文件并不能播放,这应该是造成no frame的原因吧

部分内容转载自:
https://blog.csdn.net/weixin_40922285/article/details/102967331
https://www.kancloud.cn/aollo/aolloopencv/260405

  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值