OPENCV(视频入门笔记)

目标

  • 学习读取视频,显示视频和保存视频。 学习从相机捕捉并显示它。
  • cv.VideoCapture(),cv.VideoWriter() 从相机中读取视频

从相机中读取视频

通常情况下,我们必须用摄像机捕捉实时画面。提供了一个非常简单的界面。让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来。只是一个简单的任务开始。

要捕获视频,需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。

设备索引就是指定哪个摄像头的数字。。所以我简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。

import cv2 as cv  # 导入cv2模块,并简写为cv,这是OpenCV的Python接口  
  
cap = cv.VideoCapture(0)  # 创建一个VideoCapture对象,参数0表示使用计算机的默认摄像头  
  
if not cap.isOpened():  # 检查摄像头是否成功打开  
    print("break")  # 如果摄像头没有打开,打印"break"(这里的信息可能不够明确,通常我们会打印更具体的错误信息)  
    exit()  # 退出程序  
  
while(1):  # 创建一个无限循环,用于不断读取摄像头捕获的帧  
    ret, frame = cap.read()  # 从摄像头读取一帧,ret是一个布尔值,表示是否成功读取到帧;frame是读取到的帧图像  
    if not ret:  # 如果读取帧失败  
        print("error")  # 打印错误信息  
        break  # 跳出循环  
  
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  # 将读取到的彩色帧图像转换为灰度图像  
    cv.imshow("window", gray)  # 在名为"window"的窗口中显示灰度图像  
    if cv.waitKey(1) == ord(' '):  # 等待1毫秒看是否有键盘输入,如果有且是空格键(' '),则执行if语句内的代码  
        break  # 跳出循环,结束视频捕获和显示  
  
cap.release()  # 释放VideoCapture对象,即关闭摄像头  
cv.destroyAllWindows()  # 销毁所有OpenCV创建的窗口

cap.read()

第一个参数返回布尔值(True/ False)。如果正确读取了帧,它将为True。因此,你可以通过检查此返回值来检查视频的结尾。

第二个参数返回读取视频的值

我可以通过
cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)

检查框架的宽度和高度。默认情况下,它的分辨率为640x480。但我想将其修改为320x240。只需使用和即可。

从文件播放视频

它与从相机捕获相同,只是用视频文件名更改摄像机索引。另外,在显示框架时,请使用适当的时间cv.waitKey()。如果太小,则视频将非常快,而如果太大,则视频将变得很慢(嗯,这就是显示慢动作的方式)。正常情况下25毫秒就可以了。

import cv2 as cv  # 导入cv2模块,并简称为cv,用于处理图像和视频  
  
# 使用cv2的VideoCapture函数打开视频文件  
cap = cv.VideoCapture('./video/test1.avi')  
  
# 检查视频是否成功打开  
if not cap.isOpened():  
    print("failed")  # 如果视频文件未成功打开,则打印失败信息  
    exit()  # 并退出程序  
  
# 无限循环,直到视频结束或用户按下空格键  
while 1:  
    ret, frame = cap.read()  # 读取一帧视频  
    # 如果ret为False,说明视频已结束或读取出错  
    if not ret:  
        print("视频已经结束")  # 打印视频结束信息  
        break  # 跳出循环  
  
    # 将读取到的BGR格式的帧转换为灰度图像  
    img = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  
  
    # 显示灰度图像  
    cv.imshow("img", img)  
  
    # 等待15毫秒,如果在此期间用户按下任意键,则检测是否按下空格键  
    # ord(" ")获取空格键的ASCII码值,如果用户按下空格键,则break跳出循环  
    if cv.waitKey(15) == ord(" "):  
        break  
  
# 释放视频捕捉资源  
cap.release()  
  
# 销毁所有OpenCV创建的窗口  
cv.destroyAllWindows()

保存视频

我们捕捉一个视频,一帧一帧地处理,我们想要保存这个视频。对于图像,它非常简单,只需使用 cv.imwrite()。但对于图像则比较麻烦。

首先创建一个 VideoWriter 对象。我们应该指定输出文件名(例如: output.avi)。然后我们应该指定 FourCC 代码(详见下一段)。然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作。

FourCC: 是用于指定视频编解码器的4字节代码。

# 导入必要的库
import numpy as np  # 导入NumPy库,主要用于数组和矩阵运算
import cv2 as cv  # 导入OpenCV库,并简写为cv,它是计算机视觉和图像处理的主要库

# 创建VideoCapture对象,参数0通常表示计算机的默认摄像头
cap = cv.VideoCapture(0)

# 定义视频编解码器并创建VideoWriter对象
# fourcc是一个4字节码,用于指定视频的编解码器。这里使用'XVID'
fourcc = cv.VideoWriter_fourcc(*'XVID')
# 创建VideoWriter对象,参数依次为输出文件名、编解码器、帧率、帧大小
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

# 读取摄像头的视频流,直到视频结束
while cap.isOpened():
    # 从摄像头读取一帧
    ret, frame = cap.read()
    # 如果ret为False,说明读取失败或视频结束
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break

        # 翻转图像(在垂直方向上),这里第二个参数为0表示沿x轴翻转
    frame = cv.flip(frame, 1)

    # 将翻转后的帧写入到输出视频文件中
    out.write(frame)

    # 显示当前帧
    cv.imshow('frame', frame)

    # 等待1毫秒,如果按下'q'键,则退出循环
    if cv.waitKey(1) == ord('q'):
        break

    # 释放VideoCapture对象
cap.release()
# 释放VideoWriter对象
out.release()
# 销毁所有OpenCV创建的窗口
cv.destroyAllWindows()

在创建VideoWriter对象时,需要指定输出视频的帧率(这里是20.0帧/秒)和帧大小(这里是640x480像素)。这些参数应与摄像头捕获的帧的帧率和大小相匹配,或者根据需要进行调整。

相关推荐
芊寻(嵌入式)1 分钟前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
MediaTea23 分钟前
Pr 视频过渡:沉浸式视频 - VR 色度泄漏
音视频·vr
准橙考典29 分钟前
怎么能更好的通过驾考呢?
人工智能·笔记·自动驾驶·汽车·学习方法
LNTON羚通36 分钟前
算法定制LiteAIServer摄像机实时接入分析平台烟火检测算法的主要功能
音视频·视频监控
密码小丑2 小时前
11月4日(内网横向移动(一))
笔记
鸭鸭梨吖3 小时前
产品经理笔记
笔记·产品经理
齐 飞3 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
丫头,冲鸭!!!4 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
凤枭香4 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
听忆.4 小时前
手机屏幕上进行OCR识别方案
笔记