Python OpenCV视频操作(行车记录仪案例)

基于对图片的修改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()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值