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 的官方文档以获取最新和最准确的信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费定位服务方案:华为定位+天地图逆地理编码实现位置信息查询

对于Android开发来说进行定位开发时会使用以下几个产品 高德定位sdk百度定位sdk腾讯定位sdk 由于这几款产品在商用时需要支付相应的费用&#xff0c;如果不使用这几款产品又该如何定位呢&#xff1f; 有一种解决方案就是 华为定位天地图逆地理编码实现位置信息查询 通过 华…

铁路定向声波冲击波智能驱鸟器

对于铁路系统来说&#xff0c;鸟类活动会带来潜在的安全隐患。铁路沿线的接触网、电杆等设备&#xff0c;是鸟类筑巢的理想场所&#xff0c;但鸟类在筑巢过程中&#xff0c;常常使用的树枝、铁丝等杂物&#xff0c;一旦掉落在接触网设备上&#xff0c;就可能造成带电体与接地侧…

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

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

深入理解计算机系统 CSAPP 家庭作业6.35

第一步先求(S,E,B,m) 题目说共C128个字节,块大小B为16个字节,那就是分为八组:0,1,2,3,4,5,6,7.然后每组存4个int 每个4字节 CB*E*S .B16 ,直接映射的E就是1,所以S8 (S,E,B,m)(8,1,16,7) C128M128s3b4t0 sizeof(int)0100地址(二进制)COCIsrc[0][0]00000000000000组0src[0][1…

深度学习算法面经(高频核心问题总结,持续更新)

学习的过程短期目标是丰富己身&#xff0c;长远来看有的人为了就业财富自由&#xff1b;有的则为了创造一些有意义的事物&#xff0c;更多的是为了前者。 此文章用于记录和总结深度学习相关算法岗的各种面试问题&#xff0c;搜集答案并加入博主一些浅显的理解,欢迎评论区纠正、…

shell脚本之数组

数组 定义:在集合当中指定多个元素&#xff0c;元素的类型"整数、字符串、可以是浮点" 作用&#xff1a;一次性的定义多个元素&#xff0c;可以为变量赋值提供遍历。 数组的定义方法&#xff1a; 数组名&#xff08;a b c&#xff09; 数组名不能重复 方法一&a…

一分钟搞定分班查询系统创建

新学期伊始&#xff0c;老师们又要为如何高效完成学生分班查询而头疼了&#xff0c;在忙碌的开学季&#xff0c;如何在短时间内创建一个既方便又高效的分班查询系统&#xff0c;让每一位学生都能快速了解自己的分班情况呢&#xff1f; 作为老师&#xff0c;我了解分班查询工作的…

Java基础入门day63

day63 JSON Jackson方式 package com.saas.test; ​ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.saas.entity.Student; import com.saas.entity.Birth; ​ import java.io.IOException; i…

移动端真机调试

移动端真机调试 在开发移动端项目项目中经常会用到真机调试&#xff0c;有些时候想要打印出数据&#xff0c;但是真机看不了&#xff0c;又必须需要真机才能重现&#xff0c;这时候就需要真机跟电脑一起联调 下载谷歌浏览器 重点来了&#xff1a;谷歌调试器网址&#xff1a;c…

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

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

白酒:酒文化传承中的挑战与机遇

随着时代的变迁&#xff0c;酒文化传承面临着许多挑战与机遇。我们来看看酒文化传承面临的挑战。随着现代生活方式的改变&#xff0c;人们对于传统酒文化的认知逐渐淡化。与此同时&#xff0c;年轻一代对于酒文化的兴趣不如老一辈浓厚&#xff0c;这使得酒文化的传承面临断层的…

罗克韦尔Rockwell EDI 项目案例

项目挑战 企业A有两个工厂需要接受来自Rockwell的订单&#xff0c;出于成本考虑&#xff0c;两个工厂需要使用同一套EDI系统实现对接&#xff0c;因此在EDI系统中要区分发给不同工厂的订单数据。除此之外&#xff0c;此项目中涉及到了EDI系统与SAP系统的集成&#xff0c;SAP系统…

18V-100V降5V1A恒压WT5117

18V-100V降5V1A恒压WT5117 WT5117 控制器是一个专为开关电源设计的高性能器件&#xff0c;它集成了一个能够承受高达 150V 电压的 MOSFET。这个控制器不仅支持快速启动&#xff0c;还具备低能耗待机模式&#xff0c;这得益于它的内置高压启动和自供电特性。为了在低负载条件下…

【APP移动端性能测试】第一节.APP应用架构、环境和敏捷开发模型介绍

文章目录 前言一、APP应用架构二、APP项目环境 2.1 后端项目环境 2.2 前端项目环境三、Scrum敏捷开发模型 3.1 Scrum敏捷模型基础介绍 3.2 Scrum敏捷开发开发流程总结 前言 一、APP应用架构 &#xff08;1&#xff09;APP应用架构 &#xff08;2&#xff0…

【4003】基于springboot实现的线上阅读系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

DNS域名解析----分离解析、多域名解析、父域与子域

1 理论部分 1.1 分离解析 DNS的分离解析&#xff0c;是指根据不同的客户端提供不同的域名解析记录。来自不同地址的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果。也就是内外网客户请求访问相同的域名时&#xff0c;能解析出不同的IP地址&#xff0c;实现负载…

苍穹外卖---新增员工(P16-P20)

一、需求分析和设计 &#xff08;1&#xff09;产品原型 一般在做需求分析时&#xff0c;往往都是对照着产品原型进行分析&#xff0c;因为产品原型比较直观&#xff0c;便于我们理解业务。后台系统中可以管理员工信息&#xff0c;通过新增员工来添加后台系统用户。 新增员工…

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败 解决方法&#xff1a; 首先%oracle_home%/network/admin下的sqlnet.ora文件&#xff0c;把SQLNET.AUTHENTICATION_SERVICES (NTS)加个 # 注释掉就好了

防爆监测系统:工业安全百科

防爆监测系统&#xff0c;作为现代工业安全领域的重要组成部分&#xff0c;对于预防和控制爆炸事故具有不可替代的作用。该系统集成了先进的传感技术、信号处理技术以及自动控制技术&#xff0c;实现对工业生产环境中潜在爆炸因素的实时监测和预警。 防爆监测系统能够精确识别…

RIP与OSPF发布默认路由(华为)

#交换设备 RIP与OSPF发布默认路由 合理使用默认路由可以很大程度上减少本地路由表的大小&#xff0c;并可以较好的隐藏一个网络中的路由信息&#xff0c;保护自身网络的隐秘性 另外如果在同一个路由器两端使用了不同的路由协议&#xff0c;那么如果不做路由引入或者发布默认…