Python + OpenCV图片基本操作02

系列文章目录

Python + OpenCV图片基本操作01


目录

系列文章目录

前言

一、从相机中读取一段时间视频

二、保存视频中每一帧图片

三、遇到的问题


前言

前面已经学习了如何读取图片,显示图片,保存图片,以及从相机中读取视频。

接下来,学习如何从相机中读取一段时间的视频,以及如何获取视频中图片。


一、从相机中读取一段时间视频

import cv2
from time import time, sleep

def readCamera(avi_path, times):
    # avi_path = ('.\\xxx.avi')
    # avi_path = ('.\\xxx.mp4')
    cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    # cap = cv2.VideoCapture(0)
    # codec = cv2.VideoWriter_fourcc(*'MJPG')
    codec = cv2.VideoWriter_fourcc(*'mp4v')
    # 获取框架的亮度和高度
    # print(cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 实际值:800.0 600.0
    # 获得视频的fps: cap.get(cv2.CAP_PROP_FPS)
    fps = 60.0
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
    out = cv2.VideoWriter(avi_path, codec, fps, (1920, 720))
    count = cap.get(cv2.CAP_PROP_FRAME_COUNT)  # 总帧数
    sec = time()

    while cap.isOpened():
        cur_time = time()
        ret, frame = cap.read()
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        # frame = cv2.flip(frame, 0)    # 写翻转的框架
        out.write(frame)
        if cur_time - sec > times:
            break
        # cv2.imshow('frame', frame)
        # if cv2.waitKey(1) == ord('q'):
        #     break

    # 完成工作后释放所有内容
    cap.release()
    out.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    save_path = r'.\save_video.avi'
    save_times = 1
    readCamera(save_path, save_times)

二、保存视频中每一帧图片

import cv2
import os

def readFrame():
    filename = os.path.join(os.path.dirname(__file__), 'E:\\tmp\\1.avi')
    cap = cv2.VideoCapture(filename)
    frameRate = 60
    print("FPS: ", cap.get(cv2.CAP_PROP_FPS))  # 帧数
    print("count: ", cap.get(cv2.CAP_PROP_FRAME_COUNT))     # 总帧数
    c = 1
    while(True):
        # 第一个参数ret的值为True或False,代表有没有读到图片。
        # 第二个参数frame,是当前截取一帧的图片
        ret, frame = cap.read()
        if ret:
            # if (c % frameRate == 0):    # 每隔60帧进行存储操作
            print("开始截取视频第: " + str(c) + "帧")
            cv2.imshow('./' + str(c) + ".jpg", frame)
            cv2.imwrite('./' + str(c) + ".jpg", frame)
        else:
            print("视频读取完毕")
            break
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
        c = c + 1
    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    readFrame()

三、遇到的问题

1. anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback
解决: cap = cv2.VideoCapture(0, cv2.CAP_DSHOW),有的时候,加上cv2.CAP_DSHOW之后,保存的avi会报错

2. windows下,相机保存的视频文件为avi,之后视频文件不能播放
解决:out = cv2.VideoWriter(output, fourcc, fps, (width, height), True)  # 写入视频
注意:
a. 保存为mp4的文件,mp4v不能写作MP4V
b. 不能中途停止运行程序,否则保存的.mp4文件无法播放
c. 保存为.avi格式的视频,中途停止运行程序,保存的视频可以正常播放

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值