草庐IT

【opencv】18、视频操作

Enzo 想砸电脑 2023-04-05 原文

目录


例子中用到的视频:点击查看
对应视频讲解:https://www.bilibili.com/video/BV1pG41177AC/?vd_source=35cf519a89c1804afbe62a7ac4cf26dd


一、视频基础

1、视频:视频是由一帧一帧的图像组成的。当连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频

2、视频处理:从视频中抽取出独立的帧(图像),使用图像处理的方法处理对其进行处理,以达到处理视频的目的。

3、帧速率:1秒内所出现的帧数,单位为:帧/秒,英文为 FPS (Frames Per Second)


二、摄像头初始化 / 视频文件初始化

cv2.VideoCapture() 函数既可以完成摄像头的初始化,也能用于视频文件的初始化

场景1、使用摄像头

cap = cv2.VideoCapture(摄像头ID号)   # 初始化摄像头

参数 “摄像头ID号”:摄像设备(摄像头)的 ID 编号,默认值为 -1,表示随机选取一个摄像头。

  • 如果有多个摄像头,则用数字 “0”, “1” 等表示
  • 如果只有一个摄像头,既可以使用“0”也可以使用“-1” 作为摄像头ID号

返回值 “cap”:cv2.VideoCapture 类的对象

场景2、使用视频文件

cap = cv2.VideoCapture(“文件名”)   # 初始化视频文件

三、检查摄像头/视频文件、打开摄像头/视频文件

一般情况下,使用 cv2.VideoCapture() 函数即可完成摄像头的初始化,有时为了防止初始化发生错误,可以使用 cv2.VideoCapture.isOpened() 函数来检查初始化是否成功。

return_value = cv2.VideoCapture.isOpened()

返回值 “return_value”:布尔值,若为 Ture,初始化成功; 为False,初始化不成功

如果摄像头初始化失败,可以使用函数 cv2.VideoCapture.open() 打开摄像头,

retval = cv2.VideoCapture.open(index)     # index:摄像头ID号
retval = cv2.VideoCapture.open(“filename”)     # filename:文件名

四、播放视频文件(捕获帧)

摄像头初始化成功后,就可以从摄像头中捕获帧信息了,然后我们连续的展示捕获到的帧图像,就好像是在连续的播放视频

return_value, image = cv2.VideoCapture.read()

返回值:
return_value:是否捕获成功。捕获成功值为True, 不成功为 False
image:捕获到的帧

五、关闭摄像头 / 释放摄像头

cap.release()

举例

import cv2

cap = cv2.VideoCapture(0)  # 使用摄像头
# cap = cv2.VideoCapture('traffic.avi')  # 使用视频文件

while cap.isOpened():
    ret, frame = cap.read()
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) == 27:  # ESC键
        break

cap.release()
cv2.destroyAllWindows()

六、获取属性、设置属性

获取属性

return_value = cv2.VideoCapture.get(propId)   #  propId 属性参数

设置属性 (其中的一些值可进行修改)

return_value = cv2.VideoCapture.set(propId)   #  propId 属性参数

属性枚举值:官方文档点击查看

举例:查看帧的高度与宽度

import cv2

cap = cv2.VideoCapture('traffic.avi')  # 使用视频文件

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 获取帧的宽度
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 获取帧的高度
print(width)
print(height)

while cap.isOpened():
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == 27:
        break

cap.release()
cv2.destroyAllWindows()

举例:检测摄像头的帧率

import cv2
import time

cap = cv2.VideoCapture(0)

t = 0.1
counter = 0
fps = 0
start_time = time.time()

while (True):
    ret, frame = cap.read()

    # 测帧率
    counter += 1
    if (time.time() - start_time) > t:
        fps = counter / (time.time() - start_time)
        fps = str(fps)
        counter = 0
        start_time = time.time()
    cv2.putText(frame, "FPS {0}".format(fps), (10, 30), 1, 1.5, (255, 0, 255), 2)

    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == 27:
        break

cap.release()
cv2.destroyAllWindows()

七、保存视频

保存视频的三个步骤: (1)创建对象 (2)写入视频 (3)释放对象

# 1、创建对象
out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
# 2、写入视频
out.write(frame)  # 帧图片要求是BGR格式
# 3、释放对象
out.release()

构造函数 cv2.VideoWriter 用来创建对象 ,实现初始化工作

cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)

参数:

  • filename:视频的存放路径和文件名,如果文件名已经存在,则覆盖这个文件
  • fourcc:视频编码/解码类型(格式)
    • cv.VideoWriter_fourcc('M','J','P','G') or cv.VideoWriter_fourcc(*'MJPG')这两种参数的写法都可以
    • 4个字符参数 没有什么规律可言,大家就使用的时候查一下就好了,多尝试几个,保证可以正常存储与读取

opencv中用函数cv2.VideoWriter_fourcc()来指定视频编码格式,该函数有4个字符参数,这4个字符参数构成了编码器/解码器的4字标记,每个编码器都有一个这样的标记;

下面列出几个常用的标记:
(1)cv2.VideoWriter fourcc('I', '4', '2', '0') 表示未压缩的 YUV 颜色编码格式,色度子采样为4:2:0。
该编码格式具有较好的兼容性,但产生的文件较大,文件扩展名为.avi

(2)cv2 VideoWriter fourcc('P', 'I', 'M', 'I') 表示 MPEG-1编码类型,生成的文件的扩展名为.avi

(3)cv2.VideoWriter fourcc('X', 'V', 'I', 'D') 表示MPEG-4 编码类型。
如果希望得到的视频大小为平均值,可以选用这个参数组合。该组合生成的文件的扩展名为.avi

(4)cv2.VideoWriter fourcc('T', 'H', 'E', 'O') 表示OggVorbis编码类型,文件的扩展名为.ogv

(5)cv2.VideoWriter fourcc('F', 'L', 'V', 'I') 表示 Flash 视频,生成的文件的扩展名为.fly

1、在Windows中:DIVX(尚待测试和添加)
2、在OSX中的使用:MJPG(.mp4),DIVX(.avi),X264(.mkv)
3、在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。
(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)
*** Fedora 是一个操作系统,我都不知道还有这个操作系统…

  • fps:frames per second 帧速率
  • frameSize:每一帧的长和宽
  • isColor:表示是否为彩色图像, 默认为 True

通常写法举例:

cv2.VideoWriter("output.avi", fourcc=-1, fps=20, frameSize=(1024, 768), isColor=True)

举例

import cv2

cap = cv2.VideoCapture('traffic.avi')

fourcc = cv2.VideoWriter_fourcc(*'XVID')
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
out = cv2.VideoWriter('flip.avi', fourcc, 30, (int(width), int(height)), True)

while cap.isOpened():
    ret, frame = cap.read()
    if ret==True:
        flip_frame = cv2.flip(frame, 0)
        out.write(flip_frame)
        cv2.imshow("flip_frame", flip_frame)
        if cv2.waitKey(1)==27:
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

八、视频基础操作

import cv2

cap = cv2.VideoCapture('traffic.avi')  # 使用视频文件

while cap.isOpened():
    ret, frame = cap.read()
    if ret == True:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        result = cv2.flip(gray, 0)
        cv2.imshow('result image', result)
        if cv2.waitKey(1) == 27:
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()
import cv2

cap = cv2.VideoCapture(0)  # 使用摄像头

while cap.isOpened():
    ret, frame = cap.read()
    img = cv2.Canny(frame, 100, 200)

    cv2.imshow('img', img)
    if cv2.waitKey(1) == 27:
        break

cap.release()
cv2.destroyAllWindows()

有关【opencv】18、视频操作的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  3. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  4. ruby-on-rails - Ruby on Rails I18n 插值 - 2

    大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  7. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  8. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  9. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  10. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

随机推荐