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