Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 视频图像处理基础操作 之 视频捕获/存储/提取/合成/合并

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 视频图像处理基础操作 之 视频捕获/存储/提取/合成/合并

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 视频图像处理基础操作 之 视频捕获/存储/提取/合成/合并

一、简单介绍

二、视频处理流程和原理

三、视频的捕获和存储

四、提取视频中的某些帧

五、将图片合成为视频

六、多个视频合并


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、视频处理流程和原理

视频处理的基本原理涉及到图像处理和计算机视觉领域的很多概念和算法。在处理视频时,常见的算法包括帧间差分、光流法、背景建模、物体检测和跟踪等。这些算法的原理涉及到像素级别的操作、特征提取、模型训练等。

视频有各种格式,比如AVI和MP4等,在播放视频时需要编解码,不同的播放器都有自己的编解码器。OpenCV目前对于AVI和MP4读取正常,但是有大小限制,不能超过2GB。OpenCV集成了视频处理的各种函数,处理视频的流程就是读取完一段视频后将视频切分成一张张图片,对视频处理基本上是对图像本身处理的一个遍历。另外,基于视频流可以做出各种效果,比如视频追踪、计算视频帧间处理的效果等,主要应用于图像目标检测领域。

通过对比相邻帧间的图像差异,可以计算出图像中的运动目标。

  • 物体检测:首先使用目标检测算法(如Haar级联检测器、YOLO、Faster R-CNN等)在每一帧中检测出感兴趣的目标物体,这些算法通常会使用预训练好的模型来识别目标。
  • 物体跟踪:一旦检测到目标,跟踪算法会跟踪目标物体在连续帧中的位置,常见的跟踪算法包括基于卡尔曼滤波、均值漂移、核相关滤波等。

OpenCV 提供了一些基本的流程,下面是一个简要的概述:

  1. 视频捕获(Video Capture)

    • 首先,需要使用 OpenCV 的 cv2.VideoCapture() 函数打开视频文件或者连接到摄像头。
    • 这个函数返回一个 VideoCapture 对象,你可以使用它来逐帧读取视频。
  2. 逐帧处理(Frame Processing)

    • 使用 VideoCapture 对象的 read() 方法逐帧读取视频。
    • 对于每一帧,你可以应用图像处理或计算机视觉算法。
  3. 图像处理和计算机视觉算法

    • OpenCV 提供了丰富的图像处理和计算机视觉函数,比如图像滤波、边缘检测、目标检测、跟踪等。
    • 你可以根据你的需求选择合适的函数来处理每一帧,例如使用 cv2.cvtColor() 进行颜色空间转换、cv2.Canny() 进行边缘检测、cv2.findContours() 进行轮廓检测等。
  4. 显示处理后的帧(Display Processed Frames)

    • 处理后的帧可以通过 cv2.imshow() 显示出来,也可以保存为视频文件。
    • 如果你在处理视频时想要实时显示处理后的帧,可以使用 cv2.imshow()cv2.waitKey() 结合起来。
  5. 释放资源(Release Resources)

    • 在处理完所有帧后,记得释放资源,关闭视频文件或释放摄像头。

三、视频的捕获和存储

视频的读取可以通过读取已经存储好的视频。可以通过打开Camera摄像头读取视频图像。OpenCV中获取摄像头视频使用VideoCapture类,其构造参数为摄像头的Index,一般的笔记本计算机只有一个摄像头,因此其Index一般为0。获取视频属性(码率\尺寸)使用VideoCapture的get()方法。

将视频帧写入文件使用VideoWriter类,其构造参数分别为写入的文件路径名、编码格式、帧率及视频尺寸,可以通过VideoCapture获取。

当使用 OpenCV 处理视频时,有几个关键函数在代码中被频繁使用。下面是其中一些函数的简要说明:

  1. cv2.VideoCapture()

    • 这个函数用于从视频文件或者摄像头中读取视频流。
    • 参数可以是视频文件的路径,也可以是摄像头的索引(通常为 0 表示默认摄像头)。
    • 返回一个 VideoCapture 对象,可以用来逐帧读取视频。
  2. cv2.VideoWriter()

    • 这个函数用于创建一个用于保存视频的 VideoWriter 对象。
    • 参数包括输出视频文件的名称、视频编码器的四字符编码(fourcc)、帧率(fps)、视频帧大小等。
    • 返回一个 VideoWriter 对象,可以用来逐帧写入视频。
  3. cv2.putText()

    • 这个函数用于在图像上绘制文本。
    • 参数包括输入图像、要绘制的文本、文本位置、字体、字体大小、颜色、线条粗细等。
import cv2def vedioCaptureWrite(saveName):"""视频捕捉与保存:param saveName: 类似 output.avi:return:"""# 打开摄像头cap = cv2.VideoCapture(0)# 定义视频编码器fourcc = cv2.VideoWriter_fourcc(*'XVID')# 创建 VideoWriter 对象,用于保存视频out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))# 循环读取摄像头帧while cap.isOpened():ret, frame = cap.read()if not ret:break# 在视频上绘制一个简单的示例文本font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(frame, 'Recording...', (10, 50), font, 1, (0, 255, 255), 2, cv2.LINE_AA)# 写入帧到输出视频out.write(frame)# 显示帧cv2.imshow('frame', frame)# 按 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源cap.release()out.release()cv2.destroyAllWindows()

四、提取视频中的某些帧

视频可以视为连续帧图像的集合,可以对图像的帧进行计数,也可以通过视频的时间来提取视频中的某些帧。

当从视频中提取特定帧时,有几个关键函数在代码中被频繁使用。下面是其中一些函数的简要说明:

  1. cv2.VideoCapture()

    • 这个函数用于从视频文件中读取视频流。
    • 参数可以是视频文件的路径,也可以是摄像头的索引(通常为 0 表示默认摄像头)。
    • 返回一个 VideoCapture 对象,可以用来逐帧读取视频。
  2. cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)

    • 这个方法用于设置视频帧的位置。
    • 第一个参数是帧的索引位置,第二个参数是要设置的帧索引。
    • 这个方法可以让你定位到视频的特定帧,以便读取或处理。
  3. cv2.imwrite()

    • 这个函数用于将图像保存为文件。
    • 第一个参数是输出文件的路径,第二个参数是要保存的图像数组。
    • 支持的图像格式包括 JPEG、PNG、BMP 等。
  4. cap.read()

    • 这个方法用于逐帧读取视频。
    • 返回一个布尔值和帧。布尔值表示帧是否成功读取,帧是一个 NumPy 数组,包含当前读取的帧图像的像素值。
import cv2def videoExtraction(videoName):"""提取视频中的某一帧保存为图片:param videoName: 类似 TwoPeopleRunning.mp4:return:"""# 打开视频文件cap = cv2.VideoCapture(videoName)# 检查视频是否成功打开if not cap.isOpened():print("Error: Unable to open video.")exit()# 选择要提取的帧索引frame_index = 100  # 例如,提取第 100 帧# 设置视频帧索引cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)# 读取帧ret, frame = cap.read()# 检查帧是否成功读取if not ret:print("Error: Unable to read frame.")exit()# 保存帧为图像文件cv2.imwrite('Images/videoExtraction.jpg', frame)# 关闭视频文件cap.release()print(f"Frame {frame_index} extracted and saved as output_frame.jpg")

五、将图片合成为视频

将图片合成为视频意味着将一系列图片按照一定的顺序和帧率组合成视频文件。

当将图片合成为视频时,有几个关键函数在代码中被频繁使用。下面是其中一些函数的简要说明:

  1. cv2.VideoWriter()

    • 这个函数用于创建一个用于保存视频的 VideoWriter 对象。
    • 参数包括输出视频文件的名称、视频编码器的四字符编码(fourcc)、帧率(fps)、视频帧大小等。
    • 返回一个 VideoWriter 对象,可以用来逐帧写入视频。
  2. cv2.imread()

    • 这个函数用于从图像文件中读取图像。
    • 参数是图像文件的路径。
    • 返回一个 NumPy 数组,包含图像的像素值。
  3. cv2.imwrite()

    • 这个函数用于将图像保存为文件。
    • 第一个参数是输出文件的路径,第二个参数是要保存的图像数组。
    • 支持的图像格式包括 JPEG、PNG、BMP 等。
  4. os.listdir()

    • 这个函数用于获取指定路径下的所有文件和文件夹的名称。
    • 参数是要列出的目录的路径。
    • 返回一个包含目录中所有条目的列表。
  5. os.path.join()

    • 这个函数用于将多个路径组合成一个路径。
    • 参数是要组合的路径元素。
    • 返回组合后的路径字符串。
  6. os.path.isfile()

    • 这个函数用于检查路径是否是一个文件。
    • 参数是要检查的路径。
    • 如果路径指向文件,则返回 True,否则返回 False。
import cv2
import osdef imagesCompositingVideo(imageFolder, frame):"""图片合成图片:param imageFolder: 图片文件夹,例如 'Images':param frame: 每秒多少帧,例如 30帧每秒,1帧每秒:return:"""# 图片所在文件夹images_folder = imageFolder# 读取文件夹中的所有图片文件名image_files = [f for f in os.listdir(images_folder) if os.path.isfile(os.path.join(images_folder, f))]# 指定输出视频文件名output_video = 'Videos/imagesCompositingVideo.mp4'# 定义视频编码器fourcc = cv2.VideoWriter_fourcc(*'mp4v')# 获取第一张图片的尺寸first_image = cv2.imread(os.path.join(images_folder, image_files[0]))height, width, _ = first_image.shape# 创建 VideoWriter 对象out = cv2.VideoWriter(output_video, fourcc, frame, (width, height))# 逐张读取图片并写入视频for image_file in image_files:image_path = os.path.join(images_folder, image_file)img = cv2.imread(image_path)out.write(img)# 释放资源out.release()imagesCompositingVideo()

六、多个视频合并

多个视频合并是指将多个视频文件合并成一个视频文件的过程。在这个过程中,多个视频文件的内容会按照一定的顺序连接起来,形成一个新的视频文件。合并多个视频可以用于将不同的视频片段拼接成一个完整的视频,或者将多个视频源合并为一个视频文件。

通常,多个视频合并可以分为两种情况:

  1. 简单拼接:将多个视频按照顺序连接在一起,形成一个长视频。这种合并方式不对视频进行任何处理,只是将它们连接起来。

  2. 混流合并:将多个视频文件进行混流,即将它们的视频流和音频流合并到一个视频文件中。这种合并方式通常需要对视频进行解码、编辑和编码等操作。

在实现多个视频合并时,可以使用视频编辑软件(如Adobe Premiere、Final Cut Pro等)或编程语言中的相应库(如OpenCV、FFmpeg等)来完成。

将两个视频文件合并为一个视频文件。下面是关键函数的简要说明:

  1. cv2.VideoCapture()

    • 这个函数用于从视频文件中读取视频流。
    • 参数可以是视频文件的路径,也可以是摄像头的索引(通常为 0 表示默认摄像头)。
    • 返回一个 VideoCapture 对象,可以用来逐帧读取视频。
  2. cv2.VideoWriter()

    • 这个函数用于创建一个用于保存视频的 VideoWriter 对象。
    • 参数包括输出视频文件的名称、视频编码器的四字符编码(fourcc)、帧率(fps)、视频帧大小等。
    • 返回一个 VideoWriter 对象,可以用来逐帧写入视频。
  3. cap.get()

    • 这个方法用于获取视频的属性,如帧率、宽度、高度等。
    • 参数是属性的标识符,比如 cv2.CAP_PROP_FPS 用于获取帧率。
    • 返回属性的值。
  4. cap.isOpened()

    • 这个方法用于检查视频是否成功打开。
    • 如果视频成功打开,则返回 True;否则返回 False。
  5. cap.read()

    • 这个方法用于逐帧读取视频。
    • 返回一个布尔值和帧。布尔值表示帧是否成功读取,帧是一个 NumPy 数组,包含当前读取的帧图像的像素值。
  6. out.write()

    • 这个方法用于将帧写入到视频文件中。
    • 参数是要写入的帧图像。
    • 每次调用这个方法都会将一帧图像写入到输出视频文件中。
  7. cap.release()

    • 这个方法用于释放 VideoCapture 对象占用的资源。
    • 调用这个方法后,你就不能再使用这个 VideoCapture 对象了。
  8. out.release()

    • 这个方法用于释放 VideoWriter 对象占用的资源。
    • 调用这个方法后,你就不能再使用这个 VideoWriter 对象了。
import cv2def mergeVideo(videoName1, videoName2):"""合并视频:param videoName1: 视频名称,类似 'Videos/CatRun.mp4':param videoName2: 视频名称,类似 'Videos/TwoPeopleRunning.mp4':return:"""# 打开第一个视频文件cap1 = cv2.VideoCapture(videoName1)# 打开第二个视频文件cap2 = cv2.VideoCapture(videoName2)# 获取视频信息fps = int(cap1.get(cv2.CAP_PROP_FPS))width = int(cap1.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT))# 定义视频编码器fourcc = cv2.VideoWriter_fourcc(*'mp4v')# 创建 VideoWriter 对象out = cv2.VideoWriter('Videos/mergeVideo.mp4', fourcc, fps, (width, height))# 逐帧读取并写入第一个视频文件while cap1.isOpened():ret, frame = cap1.read()if not ret:breakout.write(frame)# 逐帧读取并写入第二个视频文件while cap2.isOpened():ret, frame = cap2.read()if not ret:breakout.write(frame)# 释放资源cap1.release()cap2.release()out.release()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(表征学习论文阅读)FINITE SCALAR QUANTIZATION: VQ-VAE MADE SIMPLE

1. 前言 向量量化(Vector Quantization)或称为矢量量化最早在1984年由Gray提出,主要应用于数据压缩、检索领域,具体的阐述可以参考我写的另一篇关于VQ算法的文章。随着基于神经网络的离散表征学习模型的兴起,VQ技术也…

二维动画制作软件 Animate 2024 for mac激活版

Animate 2024 for Mac是一款功能强大的二维动画制作软件,专为Mac用户打造。它提供了丰富的动画编辑功能,使用户能够轻松创建出生动逼真的动画作品。无论是短片、广告还是游戏等应用领域,Animate 2024都能发挥出出色的表现。 软件下载&#xf…

部署k8s客户端,及docker私仓部署

1.部署一个docker私仓 mkdir /opt/docker/registry #配置仓库密码 mkdir /opt/docker/auth cd /opt/docker/auth htpasswd -Bbn admin admin > htpasswd#运行docker私仓服务,下面端口5000:5000 前面的5000对应本机端口可以自定义 docker run -itd \ -v /opt/d…

【Layui】------ layui实现table表格拖拽行、列位置的示例代码

一、完整的示例代码&#xff1a;&#xff08;请使用layui v2.8.3的版本&#xff09;看懂就能用、不要照搬、照搬会出错误、拷贝重要代码改改符合你自己的需求。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

学习笔记——C语言基本概念结构体共用体枚举——(10)

1、结构体 定义新的数据类型&#xff1a; 数据类型&#xff1a;char short int long float double 数组 指针 结构体 结构体&#xff1a; 新的自己定义的数据类型 格式&#xff1a; struct 名字{ 成员 1&#xff1b; 成员 2&#xff1b; 。 。 。 …

MapReduce [OSDI‘04] 论文阅读笔记

原论文&#xff1a;MapReduce: Simplified Data Processing on Large Clusters (OSDI’04) 1. Map and Reduce Map&#xff1a;处理键值对&#xff0c;生成一组中间键值对Reduce&#xff1a;合并与同一中间键相关的所有中间值process overview&#xff1a;分割输入数据&#x…

DSO9254A安捷伦DSO9254A示波器

181/2461/8938产品概述&#xff1a; 安捷伦DSO9254A的带宽为2.5 GHz&#xff0c;配备15英寸XGA液晶显示屏&#xff0c;采用静音封装&#xff0c;厚度仅为9英寸&#xff08;23厘米&#xff09;&#xff0c;重量仅为26磅&#xff08;11.8千克&#xff09;。DSO9254A集成了一个功…

UE4_自定义反射和折射和法线图

UE4 自定义反射和折射和法线图 2020-05-22 09:36 将ReflectionVector和反射图像进行ViewAlignedReflection,输出的textrue和相机位置CameraPosition的onePlus进行Dot点乘之后乘以一个float系数反射度&#xff0c;输出给固有色&#xff0c;就有反射效果了。球型反射。 折射&…

Coze工作流介绍(一)

Coze工作流介绍 工作流支持通过可视化的方式&#xff0c;对插件、大语言模型、代码块等功能进行组合&#xff0c;从而实现复杂、稳定的业务流程编排&#xff0c;例如旅行规划、报告分析等。 当目标任务场景包含较多的步骤&#xff0c;且对输出结果的准确性、格式有严格要求时…

JAVAEE—Callable接口,ReentrantLock,synchronized的工作过程

文章目录 Callable接口的用法Callable与FutureTask类 加锁的工作过程什么是偏向锁呢&#xff1f;举个例子 轻量级锁重量级锁 ReentrantLockReentrantLock 的用法: Callable接口的用法 Callable 是一个 interface . 相当于把线程封装了一个 “返回值”. 方便程序猿借助多线程的…

分布式IO模块PLC扩展模拟量模块

BL200是一款结构紧凑、体积小的分布式IO耦合器,支持ModbusTCP协议,采用嵌入式硬件,主频380Mhz,基于LinuxOS,采用独特的MAC层数据交换技术的双网口技术实现级联,中间设备宕机不影响后面设备的数据传输,可支持高达32个AI、DI、DO、热电阻、热电偶、RS485等种类的IO板,广泛应用于工…

Ubuntu20.04使用Neo4j导入CSV数据可视化知识图谱

1.安装JDK&#xff08; Ubuntu20.04 JDK11&#xff09; sudo apt-get install openjdk-11-jdk -y java -version which java ls -l /usr/bin/java ls -l /etc/alternatives/java ls -l /usr/lib/jvm/java-11-openjdk-amd64/bin/java确认安装路径为/usr/lib/jvm/java-11-openjd…

openGauss 基本功能和特性

基本功能和特性 背景信息 openGauss是一个单机数据库&#xff0c;具备关系型数据库的基本功能&#xff0c;以及企业特性的增强功能。 基本功能 标准SQL支持 支持标准的SQL92/SQL99/SQL2003/SQL2011规范&#xff0c;支持GBK、GB18030、GB18030_2022、UTF-8、SQL ASCII以及Lat…

Celery的任务流

Celery的任务流 在之前调用任务的时候只是使用delay()和apply_async()方法。但是有时我们并不想简单的执行单个异步任务&#xff0c;比如说需要将某个异步任务的结果作为另一个异步任务的参数或者需要将多个异步任务并行执行&#xff0c;返回一组返回值&#xff0c;为了实现此…

STL是什么?如何理解STL?

文章目录 1. 什么是STL2. STL的版本3. STL的六大组件4. 如何学习STL5.STL的缺陷 1. 什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2. …

OpenHarmony实战开发-使用一次开发多端部署实现一多设置典型页面

介绍 本示例展示了设置应用的典型页面&#xff0c;其在小窗口和大窗口有不同的显示效果&#xff0c;体现一次开发、多端部署的能力。 1.本示例使用一次开发多端部署中介绍的自适应布局能力和响应式布局能力进行多设备&#xff08;或多窗口尺寸&#xff09;适配&#xff0c;保…

WebGIS 之 vue3+vite+ceisum

1.项目搭建node版本在16以上 1.1创建项目 npm create vite 项目名 1.2选择框架 vuejavaScript 1.3进入项目安装依赖 cd 项目名 npm install 1.4安装cesium依赖 pnpm i cesium vite-plugin-cesium 1.5修改vite.config.js文件 import { defineConfig } from vite import vue fr…

x-cmd-pkg | gojq - 基于 Go 编写的 jq 工具

简介 gojq 是由 itchyny 基于 Go 编写的 jq 工具。用户还可以将 gojq 作为库嵌入到自己的 Go 产品中。 首次用户 本文的 demo 展现了如何通过 x-cmd 快速使用 gojq 。x-cmd 也提供了gojq 1分钟教程可以帮你快速入门。 功能特点 功能强大&#xff1a;提供了类似jq的功能&am…

RK3568 RTC驱动实验

RK3568 RTC驱动实验 1. RTC简介 ​ RTC 也就是实时时钟&#xff0c;用于记录当前系统时间&#xff0c;对于 Linux 系统而言时间是非常重要的&#xff0c;使用 Linux 设备的时候也需要查看时间。RTC是Linux的时间系统。 ​ RTC 设备驱动是一个标准的字符设备驱动&#xff0c;…

基于Python的微博旅游情感分析、微博舆论可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…