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像素)。这些参数应与摄像头捕获的帧的帧率和大小相匹配,或者根据需要进行调整。

相关推荐
云边有个稻草人2 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
冷眼看人间恩怨10 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
darkdragonking11 小时前
FLV视频封装格式详解
音视频
菜狗woc12 小时前
opencv-python的简单练习
人工智能·python·opencv
元争栈道13 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
元争栈道14 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
西猫雷婶14 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
云空15 小时前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
编码小哥15 小时前
opencv中的色彩空间
opencv·计算机视觉
吃个糖糖15 小时前
34 Opencv 自定义角点检测
人工智能·opencv·计算机视觉