Python + OpenCV图片基本操作02

  • Post author:
  • Post category:python




系列文章目录

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格式的视频,中途停止运行程序,保存的视频可以正常播放