基于对图片的修改OpenCV修改图片也可以用OpenCV对视频进行操作,
视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的。1秒24帧基本就能流畅的读取视频了。
利用opencv打开摄像头
1 先开启摄像头 ,返回一个可以操作摄像头的对象,
2 然后调用read方法,将获取的数据拆包,frame是图片的矩阵数据,
3 显示出读取到的矩阵数据
3 设置关闭键
4 关闭之后释放资源
import cv2
# 开启摄像头,获取操作摄像头的对象
cap = cv2.VideoCapture(0)
while 1:
# 获取一帧图像数据
# <built-in method read of cv2.VideoCapture object at 0x000001668EAC54F0>
ret, frame = cap.read()
# print(ret) # 如果读取到 值为 True
# print(frame) # 读取的一帧图片的矩阵数据
# 在窗口显示一帧图像
cv2.imshow("capture", frame)
# 每次循环等待1毫秒 如果按q键就退出,没有就继续下一帧图片
if cv2.waitKey(1) & 0xFF == ord(' '):
break
# 释放摄像头
cap.release()
# 释放所有窗口
cv2.destroyAllWindows()
cap是操作摄像头的对象,用cap调用read方法得到数据 , 再用imshow显示出图像,
ord函数是返回一个键的ASCIl码 , 我用的是空格 , 0xFF按位与计算,0x代表十六进制换成二进制是八个1 , 任何数与上1还是之前的数据 ,这里只是保存了后八位(不加也行)
录制视频然后保存 (比如行车记录仪)
录制的视频按一个小时为一个节点 , 保存起来,比如录制了四个小时,那么就有四个视频文件.
记录开始录制的时间(比如八点) , time.time获取当前时间,用现在的时间(比如现在已经九点了)减去开始录制的时间(刚才的八点), 直到等于一个小时了,那就保存这个文件 , 然后在开启一个录制视频的对象…
代码:
import time
import cv2
# 1. 获取每个视频的长度时间, 时长,单位为秒
duration = int(input("请输入每个视频的长度(单位为秒):"))
# 2. 获取设备的号0号是摄像头 , 有的可能是1
cap = cv2.VideoCapture(0)
# 获取视频播放界面长宽 四舍五入
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH) + 0.5)
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT) + 0.5)
# 定义编码器 创建 VideoWriter对象 用于生成mp4格式的视频文件 mp4格式文件较小
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # mp4v用小写
# 3. 记录开始录制的时间
last_start_time = time.time()
# 4. 开始的时候 需要有一个默认 输出视频的位置
# 参1 是文件路径和名字 参2 编码格式 参3帧率 参4宽高
out = cv2.VideoWriter('录制-' + str(int(time.time())) + '.mp4', fourcc, 20.0, (width, height))
# 5. 开始录制 两个条件 摄像头开启 和 没有按下q键退出
while cap.isOpened() and ((cv2.waitKey(1000) & 0xFF) != ord(' ')):
# 判断是否需要分割视频文件
if time.time() - last_start_time >= duration:
# 获取一个一个视频的长度,如果超过我们一开始输A入的视频长度,那么就存储关闭这个文件,重建建立一个
# 关闭上一个文件
out.release()
# 新建一个
out = cv2.VideoWriter('output-' + str(int(time.time())) + '.mp4', fourcc, 20.0, (width, height))
# 重新计时 要更新时间last_start_time
last_start_time = time.time()
# 读取一帧图像数据
ret, frame = cap.read()
# 获取成功 ret为True
if ret:
# 输出当前帧
out.write(frame)
# 显示当前图片
cv2.imshow('My Camera', frame)
else:
# 获取失败 跳出循环 退出
break
# 释放资源
out.release()
cap.release()
cv2.destroyAllWindows()