【opencv+图像处理】(Gui Features in OpenCV) 1-1摄像头:采集摄像头视频,读取视频帧,录制视频

这篇具有很好参考价值的文章主要介绍了【opencv+图像处理】(Gui Features in OpenCV) 1-1摄像头:采集摄像头视频,读取视频帧,录制视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本专栏代码总库地址 https://github.com/xiawei20161308104/xv_opencv_tutorials
本节代码路径

  1. xv_opencv_tutorials/VideoRelated/get_started_with_videos.py
  2. xv_opencv_tutorials/VideoRelated/get_and_set_video.py
  3. xv_opencv_tutorials/VideoRelated/save_video.py

参考官网https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html

0.本节涉及的opencv新函数

  • 从设备,可以是摄像头可以是本地视频,获取视频的函数 cv.VideoCapture()❗️本函数作用在于创建一个VideoCapture或者VideoWriter对象,真正的读取和写入是通过创建的对象进行read和write的调用的。视频可以采用不同的格式,如AVI,MP4,MOV等,这些格式定义了视频文件的编码方式、分辨率、帧率等参数。
  • 视频写入函数 cv.VideoWriter()
  • 读取视频 cv.VideoCapture.read()
  • 写入视频 cv.VideoWriter.write(frame)
  • 打开,判断是否打开isOpened () open()
  • 获取参数,更改参数 cv.VideoCapture.get(propId) cv.VideoCapture.set(propId, value)
  • 释放视频 cv.VideoCapture.release()

1.什么是视频

1️⃣ 什么是帧,帧的快慢是什么,影响什么

视频的基本组成部分是帧(frame),即一系列静态图像,这些图像在一定速率下以连续的方式播放,形成动态图像,例如30帧/秒。视频每秒的帧数被称为帧率(Frame Rate),通常用“fps”(Frames Per Second)表示。例如,30fps表示视频每秒钟包含30帧图像。帧率决定了视频的流畅度和真实感。较高的帧率可以使视频看起来更加流畅,因为它们可以更快地刷新图像。例如,60fps的视频比30fps的视频看起来更加流畅。此外,较高的帧率还可以减少视频中的模糊和颤动,因为它们可以更好地捕捉运动。但较高的帧率会导致文件变大和编解码更复杂,因为需要处理更多的帧图像。

总的来说,选择正确的帧率可以提高视频的观看体验并确保最佳的视觉效果。通常,电影和电视节目的帧率为24fps或30fps,而游戏和动画的帧率通常为60fps,现在的一般更高120fp很常见。

2️⃣帧是什么,什么是视频分辨率,分辨率与什么有关系

每个帧由像素组成,像素是图像中最小的单元,可以包含颜色和亮度信息。视频分辨率是指视频中每个帧的像素数量,通常用水平像素数和垂直像素数表示。例如,分辨率为1920x1080的视频表示每帧有1920个水平像素和1080个垂直像素。分辨率取决于采集和播放设备。
摄像设备的分辨率:摄像设备的分辨率决定了视频中每个帧的像素数量。高分辨率的摄像设备可以捕捉更多的像素,从而产生更高分辨率的视频。
播放设备的分辨率:播放设备的分辨率决定了视频的最终分辨率。如果视频的分辨率高于播放设备的分辨率,那么视频将被缩小以适应播放设备,从而可能导致图像失真和模糊。

2.从摄像头获取视频

1️⃣步骤

  1. 先创建一个VideoCapture对象,它的参数是设备索引或视频文件的名称,设备索引只是用来指定哪个摄像机的数字,通常情况下写0代表笔记本默认摄像头,如果你有外接摄像头需要传1来选择第二台摄像机,以此类推。
  2. 之后,就可以逐帧获取图像。
  3. 最后要释放资源也就是创建的VideoCapture对象。

2️⃣代码

git代码地址

import cv2 as cv

# 创建VideoCapture对象,用创建的对象去做之后的操作
cap = cv.VideoCapture(0)
# 检测有无摄像头正常使用
# 这是一个必要的验证,当cap为空的时候,后续调用会报错。
if not cap.isOpened():
    print("Cannot open camera")
    exit()

# 获取视频流是一个连续的循环过程,一直在获取,不是说获取到一帧就可以了
while True:
    # 通过创建的VideoCapture对象逐帧获取视频,会返回两个参数,ret返回true和false代表是否正常获取到帧,以及视频是否结束
    # frame代表获取到的帧
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("不能正常读取视频帧")
        break
    # 将获取到的视频帧,也就是一幅幅图像,转为灰度图
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 展示
    cv.imshow('frame', gray)
    # q退出获取视频流
    if cv.waitKey(1) == ord('q'):
        break
# 释放资源
cap.release()
cv.destroyAllWindows()

3️⃣效果

【opencv+图像处理】(Gui Features in OpenCV) 1-1摄像头:采集摄像头视频,读取视频帧,录制视频

4️⃣一些相关重载函数

  1. VideoCapture参数可以选择文件路径,例如:cv2.VideoCapture('test_video.mp4')
  2. isOpened()判断是否打开,cv.VideoCapture.open用来打开一段视频流,例如:cv.VideoCapture.open('test_video.mp4'),如果设备或者视频被打开,则会返回true

3.通过opencv获取视频设备的参数,设置新参数

1️⃣获取设备参数

cv.VideoCapture.get( propId ) 获取设备参数,propld填写cv2提供的参数选项,官网提供了70种可以查询的参数。返回值就是改参数的值,如果查询的参数不存在或者不支持,不报错,会返回0 。
这里只列举几个常见的。也有一些获取亮度饱和度等,需要支持的设备。

2️⃣更改设备参数

cv.VideoCapture.set( propId, value )更改设备参数,由propId更改到value 即使返回true,可能无效,是否有效取决于设备硬件、驱动和API后端。

propld参数值 返回值
cv.CAP_PROP_POS_MSEC 返回视频文件的当前位置,以毫秒计。
cv.CAP_PROP_FRAME_WIDTH 返回视频流中帧的宽度。
cv.CAP_PROP_FRAME_HEIGHT 返回视频流中的帧的高度。
cv.CAP_PROP_FPS 返回视频帧率。
cv.CAP_PROP_FRAME_COUNT 返回视频文件中的帧数。
cv.CAP_PROP_POS_MSEC 查询视频文件的当前位置,以毫秒计。

3️⃣代码

git仓库地址

import cv2 as cv

# 创建VideoCapture对象,用创建的对象去做之后的操作
cap2 = cv.VideoCapture(0)

while True:
    # 获取设备参数,cv.CAP_PROP_FRAME_WIDTH,CAP_PROP_FRAME_HEIGHT是cv2提供的参数选项
    width, height = cap2.get(cv.CAP_PROP_FRAME_WIDTH), cap2.get(cv.CAP_PROP_FRAME_HEIGHT)
    # 我这里是1280.0 720.0
    print(width, height)

    # 以原分辨率的两倍来捕获
    cap2.set(cv.CAP_PROP_FRAME_WIDTH, width * 2)
    cap2.set(cv.CAP_PROP_FRAME_HEIGHT, height * 2)
    _, frame2 = cap2.read()

    gray_double = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY)
    # 展示
    cv.imshow('doubel read', gray_double)
    # q退出获取视频流
    if cv.waitKey(1) == ord('q'):
        break
# 释放资源
cap2.release()
cv.destroyAllWindows()

  • 效果:

【opencv+图像处理】(Gui Features in OpenCV) 1-1摄像头:采集摄像头视频,读取视频帧,录制视频
很明显长变为原来的2倍了,宽没变,因为,实际是否起作用取决于硬件

4.录制视频并保存

1️⃣ 步骤

  1. 定义编码方式,创建VideoWriter对象,有五个参数,VideoWriter (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)分别是:
    • 输出的文件名,如’output.avi’
    • 编码方式FourCC码
    • 帧率FPS
    • 要保存的分辨率大小
    • 最后一个是isColor标志。如果它是 “True”,编码器就会期待彩色帧,否则就会使用灰阶帧。
  2. 定义一个VideoCapture
  3. 执行写入函数将VideoCapture捕获的内容按照设定好的方式写入指定位置

2️⃣ 代码

git仓库地址

import numpy as np
import cv2 as cv

cap = cv.VideoCapture(0)
# 定义编码方式创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('../imgs/output_video.avi', fourcc, 20.0, (640, 480))

# 当cap打开状态执行
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break

    # 写入文件
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

3️⃣ 效果

【opencv+图像处理】(Gui Features in OpenCV) 1-1摄像头:采集摄像头视频,读取视频帧,录制视频

4️⃣ 补充视频编码方式

视频编码将视频信号转换为数字信号的过程,以便在数字媒体设备上存储和传输。
常见编码方式有

H.264:H.264是一种广泛使用的视频编码标准,也称为AVC(Advanced Video Coding)。它支持高质量视频压缩,并可提供高清晰度视频和流媒体。
H.265:H.265,也称为HEVC(High Efficiency Video Coding),是一种新的视频编码标准,它比H.264提供更高的压缩比和更好的图像质量。
MPEG-2:MPEG-2是一种广泛使用的视频编码标准,用于数字电视、DVD和蓝光光盘等高清晰度视频。
MPEG-4:MPEG-4是一种支持视频、音频和多媒体内容的编码标准,也用于流媒体和网络视频。
VP9:VP9是一种由Google开发的视频编码标准,它提供比H.264更好的压缩效率和图像质量,并支持4K和8K视频。
AV1:AV1是一种由Alliance for Open Media开发的新一代开放视频编码标准,旨在提供更高的压缩效率和更好的图像质量。

FourCC是一种用于标识视频编解码器的四个字符代码,通常由四个大写字母组成,用于标识视频解码器和编码器。例如,MPEG-4视频格式的FourCC代码是“MP4V”,H.264视频格式的FourCC代码是“H264”。FourCC代码的好处是在视频编辑和处理软件中,可以选择正确的解码器,从而确保视频文件可以正确地播放和编辑,并且在不同的平台和应用程序之间进行交互。文章来源地址https://www.toymoban.com/news/detail-435552.html

到了这里,关于【opencv+图像处理】(Gui Features in OpenCV) 1-1摄像头:采集摄像头视频,读取视频帧,录制视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于OpenCV的传统视觉应用 -- OpenCV图像处理 图像模糊处理 图像锐化处理

    图像处理是用计算机对图像进行分析,以获取所需结果的过程,又称为影像处理。图像处理一般是指数字图像的处理。数字图像是用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。 均值滤波是指任意一点的像素

    2024年02月07日
    浏览(55)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(55)
  • OpenCV图像处理-灰度处理

    灰度的线性变换将图像中的所有像素点的值按 线性变换函数 进行变换。 在曝光不足或过度的情况下,图像的灰度值会局限在一个很小的范围内,这时在显示器上看到的将是一个模糊不清、似乎没有层次的图像。 针对这一情况,使用一个线性单值函数对图像内的每一个像素做

    2024年02月08日
    浏览(94)
  • OpenCV实战(1)——OpenCV与图像处理基础

    OpenCV 是一个的跨平台计算机视觉库,包含了 500 多个用于图像和视频分析的高效算法。本节将介绍 OpenCV 的基础知识,以及如何编译运行 OpenCV 程序,并将学习如何完成最基本的图像处理任务——读取、显示和保存图像。除此之外,鼠标事件和图形绘制也是 OpenCV 计算机视觉项

    2024年02月05日
    浏览(35)
  • opencv 图像基础处理_灰度图像

    二值图像表示起来简单方便,但是因为其仅有黑白两种颜色,所表示的图像不够细腻。如果想要表现更多的细节,就需要使用更多的颜色。例如,图 2-3 中的 lena 图像是一幅灰度图像, 它采用了更多的数值以体现不同的颜色,因此该图像的细节信息更丰富。 通常,计算机会将

    2024年02月15日
    浏览(45)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果 一、简单介绍 二、简单图像倾斜校正处理效果实现原理 三、简单图像倾斜校正处理效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语言。是一种面向对

    2024年04月13日
    浏览(57)
  • opencv-图像处理基础-二值图像

    1.二值图像 二值图像是指仅仅包含黑色和白色两种颜色的图像。 在计算机中,通过一个栅格状排列的数据集(矩阵)来表示和处理图像。例如,图 2-1 是 一个字母 A 的图像,计算机在处理该图像时,会首先将其划分为一个个的小方块,每一个小方 块就是一个独立的处理单位

    2024年02月15日
    浏览(47)
  • OpenCV图像处理-图像分割-MeanShift

    MeanShift严格说来并不是用来对图像进行分割的,而是在色彩层面的平滑滤波。它会中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的的颜色区域,它以图像上任意一点P为圆心,半径为sp,色彩幅值为sr进行不断地迭代。 语法:pyrMeanShiftFiltering(img, double sp, double sr,

    2024年02月16日
    浏览(32)
  • (3-1)OpenCV图像视觉处理:OpenCV基础

    OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法(最基本的滤波到高级的物体检测皆有涵盖)。在本章的内容中,将详细讲解在P ython程序中使用 OpenCV 实现 图像视觉处理的 知识,为读者步入本书

    2024年02月21日
    浏览(43)
  • Opencv图像处理(全)

    🍕 专栏:Pytorch项目实战 🌭 Opencv 图像处理(全) 🍱 Opencv C++图像处理(全) 🍳 Pillow 图像处理(PIL.Image) 🍝 Pytorch基础(全) 🥙 Python常用内置函数(全) 🍰 卷积神经网络CNN的经典模型 🍟 卷积神经网络CNN的实战知识 🥘 三万字硬核详解:yolov1、yolov2、

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包