opencv 视频处理

概述

        OpenCV 的视频模块是其核心组成部分之一,主要负责视频文件的读取、处理、分析以及视频流的捕获和输出。这一模块使得开发者能够轻松地处理来自摄像头、文件或其他视频源的视频数据,进行实时或离线的图像处理和计算机视觉任务。以下是 OpenCV 视频模块的一些关键组件和功能简介:

1. cv::VideoCapture 类

  • 功能:用于从摄像头或视频文件中捕获视频帧。通过传递设备索引或视频文件路径给构造函数,可以创建一个 VideoCapture 对象。之后,可以通过 read() 方法逐帧读取视频。
  • 属性获取:可以获取视频的帧率 (CAP_PROP_FPS)、帧大小 (CAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHT) 等属性。
  • 视频来源:支持多种视频源,包括本地文件(如 .mp4.avi 等)和网络摄像头。

2. cv::VideoWriter 类

  • 功能:用于将处理后的视频帧写入视频文件。可以指定输出文件名、编码器、帧率和帧大小。
  • 编码器选择:通过 fourcc 参数指定编码器(例如,cv::VideoWriter::fourcc('M','J','P','G') 对应于 MJPG 编码)。
  • 视频输出:支持多种视频格式,但实际可用的编码器和格式依赖于系统安装的 FFmpeg 或其他后端库。

3. 实时视频处理

  • 帧处理:读取的每一帧都可以通过 OpenCV 提供的各种图像处理函数进行处理,如色彩空间转换、滤波、边缘检测、特征提取等。
  • 实时应用:结合高效的算法,可以实现实时的视频监控、人脸识别、物体追踪等应用。

4. 视频分析

  • 运动检测:基于帧差法、背景减除等技术,可以识别视频中的运动区域。
  • 目标跟踪:实现对特定目标的连续帧间跟踪,如卡尔曼滤波器、光流法、深度学习跟踪器等。
  • 场景解析:进行场景分割、行为识别等高级视频理解任务。

5. 后端支持与兼容性

  • FFmpeg集成:OpenCV 可以利用 FFmpeg 库来支持更广泛的视频格式和编解码器,提升兼容性和性能。
  • 跨平台:OpenCV 的视频模块设计为跨平台,支持 Windows、Linux、macOS 等操作系统,但具体功能和性能可能会因操作系统和后端库的差异而有所不同。

6. 性能优化

  • 多线程和硬件加速:虽然 OpenCV 自身不直接提供多线程视频处理功能,但开发者可以通过多线程技术并结合硬件加速(如利用 CUDA、OpenCL 或 FFmpeg 的 GPU 解码)来提升视频处理的效率。

实现原理

         接口上opencv支持cv::VideoCapture、cv::VideoWriter两个接口来处理视频,后端则支持多种框架,一般默认使用的ffmpeg作为后端处理。

通过cmake-gui 查看参数配置

生成的信息查看ffmpeg信息

你也可以通过代码查看后端类型

cv::VideoCapture cap(videoFileName);
std::cout << "BackendName" << cap.getBackendName() << std::endl;

使用示例

打开默认摄像头

//declare a capture object
cv::VideoCapture cap(0, cv::CAP_MSMF);
//or specify the apiPreference with open
cap.open(0, cv::CAP_MSMF);

打开视频文件

//declare a capture object
cv::VideoCapture cap(filename, cv::CAP_MSMF);
//or specify the apiPreference with open
cap.open(filename, cv::CAP_MSMF);

处理视频流

    cv::VideoCapture cap(videoFileName); // 替换为你的视频文件路径if (!cap.isOpened()) {std::cout << "无法打开视频文件" << std::endl;return ;}auto frameCount = cap.get(cv::CAP_PROP_FRAME_COUNT);while (true) {cv::Mat frame;if(!cap.read(frame)){break;}// do ......} cap.release();

视频播放

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv)
{// 检查是否有视频文件作为参数传入if (argc != 2){std::cout << "Usage: " << argv[0] << " <video_file_path>" << std::endl;return -1;}// 使用视频文件路径初始化VideoCapture对象cv::VideoCapture cap(argv[1]);if (!cap.isOpened()){std::cout << "Error opening video file" << std::endl;return -1;}// 获取视频的帧率double fps = cap.get(cv::CAP_PROP_FPS);if (fps <= 0){fps = 30; // 如果无法获取帧率,默认设为30}// 创建一个窗口用于显示视频cv::namedWindow("Video Player", cv::WINDOW_NORMAL);cv::Mat frame;while (true){// 读取下一帧if (!cap.read(frame)){// 如果没有更多帧,跳出循环break;}// 显示当前帧cv::imshow("Video Player", frame);// 按任意键退出,或者根据fps控制播放速度if (cv::waitKey(1000 / fps) >= 0){break;}}// 释放资源并关闭窗口cap.release();cv::destroyAllWindows();return 0;
}

对ffmpeg进行特殊处理

        可以设置环境变量OPENCV_FFMPEG_WRITER_OPTIONS、OPENCV_FFMPEG_CAPTURE_OPTIONS传递附加参数。

参数格式:key;value|key;value|key;valuehwaccel;cuvid|video_codec;h264_cuvid|vsync;0vcodec;x264|vprofile;high|vlevel;4.0

OPENCV_FFMPEG_WRITER_OPTIONS 是一个环境变量,用于传递给 OpenCV 的 FFmpeg 视频写入器(VideoWriter)的特定选项。这些选项可以影响视频编码、质量、格式等。该环境变量的值是一个字符串,通常以分号(;)分隔不同的选项键值对。

每个键值对的格式通常是 key;value,其中 key 是选项的名称,value 是对应的值。例如:

  • video_codec;h264:指定视频编码器为 H.264。
  • audio_codec;aac:指定音频编码器为 AAC。
  • bit_rate;1000000:设置比特率为 1000000 bps。
  • preset;slow:设置编码预设,如 slowmedium 或 fast,这会影响编码速度和质量。
  • crf;23:设置恒定速率因子(Constant Rate Factor),影响视频质量。

请注意,不是所有的 FFmpeg 选项都适用于 OPENCV_FFMPEG_WRITER_OPTIONS,因为 OpenCV 的 VideoWriter 类可能只支持 FFmpeg API 的一部分。此外,可用的选项可能因 OpenCV 版本和 FFmpeg 版本的不同而不同。在使用时,建议查阅 OpenCV 和 FFmpeg 的官方文档以获取最新和最准确的信息。

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

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

相关文章

Pentest Muse:一款专为网络安全人员设计的AI助手

关于Pentest Muse Pentest Muse是一款专为网络安全研究人员和渗透测试人员设计和开发的人工智能AI助手&#xff0c;该工具可以帮助渗透测试人员进行头脑风暴、编写Payload、分析代码或执行网络侦查任务。除此之外&#xff0c;Pentest Muse甚至还能够执行命令行代码并以迭代方式…

Excel 找出最大值及其相邻的 N 个成员

某列都是数值&#xff1a; A1132213464215496973482396101113712491342144015151631171718114719182030212222423252419251326272738283029163012312332333233419351436463723383739384028 请找出最大值及其相邻的 10 个成员&#xff0c;注意越界检查&#xff0c;实际符合条件…

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式

JAVA云HIS医院管理系统源码&#xff1a;可医保对接的云HIS运维平台源码 SaaS模式 云HIS系统运用云计算、大数据、物联网等新兴信息技术&#xff0c;为医疗机构提供全面的医疗信息管理服务。该系统支持医保功能&#xff0c;通过与医保系统的对接&#xff0c;实现了医疗费用的自…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1&#xff09;socket----创建socket对象。 2&#xff09;bind----绑定本机ipport。 3&#xff09;listen----监听来电&#xff0c;若在监听到来电&#xff0c;则建…

Vue 3的组合式API:你真的需要它吗?

Vue 3的组合式API&#xff1a;你真的需要它吗&#xff1f; 随着Vue 3的发布&#xff0c;我们迎来了一个新的API——组合式API&#xff08;Composition API&#xff09;。这个API为开发者提供了更灵活、更可复用的代码编写方式。然而&#xff0c;传统的选项式API&#xff08;Opt…

分布式操作系统入门:可的哥(Codigger)引领新潮流

早期&#xff0c;大型机系统盛行&#xff0c;随后个人计算机如Windows、Mac OS等操作系统普及。随着技术发展和计算需求增长&#xff0c;单机系统的局限显现&#xff0c;推动了分布式操作系统的崛起。操作系统演进显露出从单机到多机、从集中到分散的趋势。传统单机系统在处理大…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 当你从摄像头读取实时视频时&#xff0c;如果想在视频的画面中画一个方框&#xff0c;或者是画一个圆&#xff0c;是很简单的事情&#xff0c;可是…

Python爬虫技术:动态JavaScript加载音频的解析

在当今的互联网世界中&#xff0c;JavaScript已成为构建丰富交互体验不可或缺的技术。然而&#xff0c;对于网络爬虫开发者来说&#xff0c;JavaScript动态生成的内容却带来了不小的挑战。音频内容的动态加载尤其如此&#xff0c;因为它们往往涉及到复杂的用户交互和异步数据加…

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch&#xff08;✔&#xff09;DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

【C#】字符串处理器

实现&#xff1a; 统计字符串中单词的数量。查找字符串中最长的单词&#xff0c;并显示其长度。将字符串中的所有单词首字母大写。将字符串中的所有单词反转。 要求&#xff1a; 使用面向对象的方式实现&#xff0c;包括至少一个类&#xff08;例如 StringProcessor&#xf…

视频智能分析平台智能边缘分析一体机视频监控业务平台区域人数不足检测算法

智能边缘分析一体机区域人数不足检测算法是一种集成了先进图像处理、目标检测、跟踪和计数等功能的算法&#xff0c;专门用于实时监测和统计指定区域内的人数&#xff0c;并在人数不足时发出警报。以下是对该算法的详细介绍&#xff1a; 一、算法概述 智能边缘分析一体机区域…

怎么把pdf文件转cad图纸?方法分享!

怎么把pdf文件转cad图纸&#xff1f;在数字化时代&#xff0c;PDF和CAD作为两种常见的文件格式&#xff0c;各自在各自的领域发挥着重要作用。然而&#xff0c;当需要在两者之间进行转换时&#xff0c;许多人可能会感到困惑和无从下手。今天&#xff0c;我将为大家推荐三款强大…

【无标题】小红书618投放高效复盘|种草效果评估

618大促进入尾声&#xff0c;品牌投放是否达到预期目标&#xff1f;如何找准复盘重点&#xff1f;如何衡量种草效果&#xff1f;如何沉淀优质的策略&#xff1f; 基于这些问题&#xff0c;千瓜推出618小红书投放复盘攻略&#xff0c;帮助品牌厘清复盘思路&#xff0c;在大促后快…

数组和文本三剑客

数组&#xff1a; 数组的定义&#xff1a;在集合当中指定多个元素&#xff0c;元素的类型&#xff1a;整数&#xff0c;字符串&#xff0c;浮点数。 数组的作用&#xff1a;可以一次性的定义多个元素&#xff0c;可以为变量赋值提供便利。 数组的定义方法&#xff1a; 数组…

手机录屏声音怎么录?2个小妙招教会你

手机录制好的视频怎么没有声音&#xff1f;你是否也遇到了这个难题&#xff1f;在日常生活中&#xff0c;手机录屏功能已经成为我们生活和工作中的得力助手。而录屏的声音&#xff0c;作为录屏功能的重要组成部分&#xff0c;更是为我们的录制体验增添了不少色彩。那么&#xf…

SSA-CNN多输入时序|樽海鞘算法-卷积神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&…

Termius for Mac/Win:跨平台多协议远程管理利器

Termius for Mac/Win是一款备受瞩目的跨平台多协议远程管理软件&#xff0c;以其卓越的性能、丰富的功能和便捷的操作体验&#xff0c;赢得了广大用户的青睐。无论是在企业IT管理、系统维护&#xff0c;还是个人远程连接、文件传输等方面&#xff0c;Termius都展现出了出色的实…

乾坤微服务的使用

前言&#xff1a; 在这里整理下用乾坤来开发微服务的一些资料。 使用好处&#xff1a; 使用乾坤可以实现什么效果呢&#xff1f;众所周知&#xff0c;前端的框架五花八门&#xff0c;react/vue/angular等各领风骚&#xff0c;那么如果我们有需要把不同技术栈的项目整合起来&…

Mysql启动报错:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

某天开机,发现Mysql被异常关闭,并且启动不起来,出这篇文章也是为了下次遇到类似问题,迅速解决(请细读文章,因为第二个方案才是主要方案) 第一个解决方案 我采用的第一个方法查“端口占用“问题(因为这是一篇博客所以我写的操作比较详细为了方便后面看这篇博客的人,我自…

如何在前端项目中用字体图标替换图片,方便减小打包体积和统一切换颜色

1.进入阿里妈妈矢量图标图库 地址&#xff1a;阿里妈妈矢量图 2.搜索自己想要的图标 3.添加自己想要的图标 4.把刚才选的图标&#xff0c;添加到自己要下载的项目 5.把项目下载到本地 6.引入iconfont.css 在div上增加对应的类名就可以啦 下载的所有类名都在下面的demo_index…