当前位置: 首页 > article >正文

OpenCV 图形API(3)高层次设计概览

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

描述

G-API 是一个异构框架,提供了统一的 API 来使用多个支持的后端编程图像处理流水线。

关键的设计理念是在指定使用哪些内核和设备时保持流水线代码本身的平台中立性,这通过在图编译(配置)时使用额外的参数来实现。这一要求导致了如下架构:
在这里插入图片描述

G-API 框架架构
在这一架构中有三个层次:
  • API层 – 这是顶层,实现了G-API的公共接口、其构建块及其语义。当用户使用G-API构建一个流水线时,他直接与此层交互,用户操作的实体(如cv::GMat或cv::GComputation)由这一层提供。

  • 图编译器层 – 这是中间层,它将用户的计算展开成图,然后对其应用一系列转换(例如优化)。这一层建立在ADE框架之上。

  • 后端层 – 这是最底层,列出了多个后端。与上述两层相比,后端与低级平台细节高度耦合,每个后端代表一个特定的平台。后端对来自图编译器的处理过的图进行操作,并针对特定平台或设备最优地执行这个图。

API层

API层是用户在定义和使用流水线(在G-API术语中称为计算)时直接交互的部分。API层定义了一组G-API动态对象,这些对象可以用作图中的输入、输出和中间数据对象:

  • cv::GMat
  • cv::GScalar
  • cv::GArray(模板类)

API层还指定了可以应用于这些数据对象的一系列操作——即所谓的内核。有关G-API默认提供的操作的详细信息,请参见G-API的核心和imgproc命名空间。

G-API不限于这些操作——用户可以使用特殊的宏G_TYPED_KERNEL()轻松定义自己的内核。

API层还负责在创建流水线时对操作参数进行编组和存储。除了上述提到的G-API动态对象外,操作还可以接受任意参数(更多详情见此处),因此API层会在执行时捕获这些值并内部存储。

最后,cv::GComputation和cv::GCompiled是API层中剩余的重要组件。前者将一系列G-API表达式封装到一个对象(图)中,而后者是图编译的产物(详见此章节)。

图编译器层

每个G-API计算在执行之前都会被编译。编译过程通过两种方式触发:

  • 隐式编译,当使用cv::GComputation::apply()时触发。在这种情况下,图编译紧接着立即执行。
  • 显式编译,当使用cv::GComputation::compile()时触发。这种情况下,将返回一个cv::GCompiled对象,该对象可以像C++函数对象一样被调用。

第一种方式适用于输入数据格式事先未知的情况——例如,当数据来自任意输入文件时。第二种方式推荐用于部署(生产)场景,在这些场景中,输入数据特征通常是预定义的。

图编译过程建立在ADE框架之上。最初,根据API层捕获的表达式生成一个二分图。这个图包含两种类型的节点:数据和操作。图总是以一个或多个数据节点开始和结束,其间是操作节点。每个操作节点都有输入和输出,它们都是数据节点。

在初始图生成之后,它实际上会经过一系列称为“passes”的图变换处理。ADE框架充当编译pass管理引擎,而passes是专门为G-API编写的。

存在不同的passes来检查图的有效性、细化操作和数据的细节、基于亲和性或用户指定的区域化[TBD]将节点组织成集群(“Islands”),等等。后端也能够在编译过程中注入特定于后端的passes,更多关于这方面的信息请参见专门的章节。

图编译的结果是一个编译后的对象,由类cv::GCompiled表示。无论是否有显式或隐式的编译请求(见上文),都会创建一个新的cv::GCompiled对象。实际的图执行是在cv::GCompiled内发生的,并由参与图编译的后端决定。

另请参阅:

  • cv::GComputation::apply()
  • cv::GComputation::compile()
  • cv::GCompiled

后端层

上述图表列出了两个后端:OpenCV和Fluid。OpenCV被称为“参考后端”,它使用传统的OpenCV函数实现G-API操作。这个后端对于在熟悉的开发系统上进行原型设计非常有用。Fluid是一个插件,用于在CPU上高效执行缓存——它实现了不同的执行策略,并使用其特有的内核。Fluid后端允许在CPU上运行时减少内存占用并提高内存局部性。

可能还有更多的后端可用,例如Halide、OpenCL等——G-API提供了一个统一的内部API来开发后端,因此任何爱好者或公司都可以自由地在新平台或加速器上扩展G-API。在OpenCV基础设施方面,每个新的后端都是一个新的独立OpenCV模块,当作为OpenCV的一部分构建时,它扩展了G-API。

图执行

图的执行方式由编译时选择的后端定义。实际上,每个后端在图编译过程的最终阶段生成自己的执行脚本,即创建可执行(编译)对象时。例如,在OpenCV后端中,这个脚本只是需要调用的OpenCV函数的拓扑排序序列;对于Fluid后端,情况类似——是每次迭代处理输入行的代理(Agents)的拓扑排序列表。

图执行通过两种方式触发:

  • 通过cv::GComputation::apply(),为给定的输入数据即时编译图;
  • 通过cv::GCompiled::operator()(),当图已被预编译时使用。

这两种方法都是多态的,接受变长参数列表,并在运行时执行有效性检查。如果传递的数据对象的数量、形状和格式与预期不符,则会抛出运行时异常。G-API还提供了类型包装器,将这些检查移到编译时——参见cv::GComputationT<>。

G-API图执行声明为无状态的——这意味着已编译的函数对象(cv::GCompiled)就像一个纯粹的C++函数一样工作,并对相同的输入参数集提供相同的结果。

这两种执行方法都接受N+M个参数,其中N是输入数量,M是在其上定义cv::GComputation的输出数量。请注意,虽然在定义中使用了G-API类型(如cv::GMat等),但执行方法接受持有实际数据的传统OpenCV数据类型(如cv::Mat)——参见参数编组中的表格。

另请参阅:
实现细节
内核API

相关文章:

OpenCV 图形API(3)高层次设计概览

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 G-API 是一个异构框架&#xff0c;提供了统一的 API 来使用多个支持的后端编程图像处理流水线。 关键的设计理念是在指定使用哪些内核和设备时保持流…...

51单片机的五类指令(五)——位操作类指令

目录 一、位传送指令 1、MOV C, bit 2、MOV bit, C 3、位传送指令的应用场景 二、位变量修改指令 1、CLR&#xff08;清 0 指令&#xff09; 2、SETB&#xff08;置 1 指令&#xff09; 3、位变量修改指令的应用场景 三、位变量逻辑操作指令 1、位变量逻辑与指令 ANL…...

用python编写poc的流程

目录 一、POC 编写核心流程 二、常用 Python 库与工具 三、POC 框架推荐 四、高级优化技巧 五、安全规范与注意事项 六、实战案例&#xff1a;命令注入漏洞验证 一、POC 编写核心流程 漏洞分析 确定漏洞类型&#xff1a;根据目标特征判断漏洞类型&#xff08;如 SQL 注入、…...

碰一碰发视频网页版本开发的源码搭建指南

引言 在数字化信息快速传播的时代&#xff0c;近场通信&#xff08;NFC&#xff09;技术为信息交互带来了新的便捷方式。通过网页版本实现碰一碰发视频功能&#xff0c;能够让用户在浏览器环境中轻松实现视频分享&#xff0c;拓展了视频传播的途径。本文将详细介绍碰一碰发视频…...

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…...

多台服务器上docker部署 Redis 集群

规划集群节点 确保你的服务器有固定 IP&#xff0c;比如&#xff1a; 172.16.17.100 172.16.17.101 172.16.17.102 每台服务器运行 2 个 Redis 节点&#xff0c;总共 6 个节点&#xff0c;满足 Redis Cluster 最小节点数要求。 2. 在每台服务器上运行 Redis 在每台服务器上执行…...

Redis-16.在Java中操作Redis-Spring Data Redis使用方式-操作有序集合类型的数据

一. 操作有序集合类型的数据 package com.sky.test;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.*;imp…...

针对单台浪潮服务器运行Windows Server 2019和SQL Server的MES系统场景、高效能监控策略(兼顾软硬件健康)

--- ### **一、监控架构设计原则** - **轻量化**&#xff1a;优先使用Windows原生工具和免费方案&#xff0c;避免额外资源消耗 - **关键性聚焦**&#xff1a;仅监控直接影响MES运行的核心指标 - **自动化告警**&#xff1a;异常发生时主动触发通知&#xff0c;无需人工巡检 -…...

Vue Transition组件类名+TailwindCSS

#本文教学结合TailwindCSS实现一个Transition动画的例子# 举例代码&#xff1a; <transition enter-active-class"transition-all duration-300 ease-out"enter-from-class"opacity-0 translate-y-[-10px]"enter-to-class"opacity-100 translate-…...

Anaconda和Pycharm的区别,以及如何选择两者

目录 主要区别详细说明如何选择&#xff1f;Anaconda的使用步骤 主要区别 Anaconda 和 PyCharm 是 Python 开发中常用的两个工具&#xff0c;但它们的定位和功能完全不同。以下是它们的主要区别&#xff1a; 对比项AnacondaPyCharm类型Python 发行版 包管理工具Python 集成开…...

STM32智能手表——任务线程部分

RTOS和LVGL我没学过&#xff0c;但是应该能硬啃这个项目例程 ├─Application/User/Tasks # 用于存放任务线程的函数 │ ├─user_TaskInit.c # 初始化任务 │ ├─user_HardwareInitTask.c # 硬件初始化任务 │ ├─user_RunModeTasks.c…...

SQL命令

一、表的创建 SQL MS Access、MySQL 和 SQL Server 数据类型 | 菜鸟教程 SQL Server 和 MySQL 中的 Date 函数 | 菜鸟教程 1.1、创建表 CREATE TABLE Citys (CityID int PRIMARY KEY,CityName varchar(255) );CREATE TABLE Per (PersonID int PRIMARY KEY, …...

DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC

drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1); 这两行代码用于启用 Linux DRM&#xff08;Direct Rendering Manager&#xff09;客户端的两个关键特性&#xff0c;具体作用如下&#xff1a; 1. drmSetClientCap…...

anaconda安装 创建虚拟环境+pycharm中conda环境配置

miniconda下载安装参考以下链接&#xff1a; https://blog.csdn.net/2301_76831056/article/details/143165738?fromshareblogdetail&sharetypeblogdetail&sharerId143165738&sharereferPC&sharesourceweixin_63339973&sharefromfrom_link &#xff08;注…...

EasyExcel导出导入excel工具类

接上一篇EasyExcel导出导入excel的文章&#xff0c;附上一份完整的工具类代码。对于字体颜色名称&#xff0c;请参考这篇文章。 POI字体颜色 小技巧 类转换用属性拷贝不同类如果有相同属性&#xff0c;则使用反射验证&#xff0c;减少代码量 private List<Person> vali…...

终端SSH连接工具SecureCRT安装和连接Linux

SecureCRT 9.5是一款集终端仿真与加密功能于一身的专业软件&#xff0c;其坚如磐石的安全性、高效的信息传输能力以及高度可定制的会话管理&#xff0c;使得它成为众多用户的首选。该软件不仅支持SSH2、SSH1、Telnet等多种协议&#xff0c;还提供了Relogin、Serial、TAPI、RAW等…...

赛逸展2025“创新引擎”启动:限量席位,点亮科技绿色新征程

当今时代&#xff0c;科技革新与绿色发展已然成为推动社会进步的双引擎。2025第七届亚洲消费电子技术贸易展&#xff08;赛逸展&#xff09;敏锐捕捉这一趋势&#xff0c;重磅打造“科技创新专区”&#xff0c;并面向科技、绿色企业吹响限量招募号角。 这个独具特色的专区紧扣…...

Spring的 init-method, @PostConstruct, InitializingBean 对比

Spring的 init-method, PostConstruct, InitializingBean 对比 在Spring框架中&#xff0c;init-method、PostConstruct和InitializingBean都是用于定义Bean初始化后执行逻辑的机制&#xff0c;但它们在实现方式、耦合度、执行顺序及适用场景上有所不同。以下是它们的对比总结…...

Gogs 精简备份与恢复方案(仅SQLite数据库和配置)

一、备份方案设计 1. 备份内容 SQLite数据库文件&#xff1a;/home/git/gogs/data/gogs.db 配置和附件&#xff1a;/home/git/gogs/custom 整个目录 2. 备份策略 每周日凌晨2点执行完整备份 保留最近4周的备份文件 备份存储在独立分区 /backup&#xff08;使用永久化挂载…...

FPGA实现数码管显示分秒时间

目录 一. verilog实现 二. 烧录验证 三. 结果验证 使用开发板&#xff1a;DE2-115开发板 一. verilog实现 要实现分和秒&#xff0c;需要知道定时器的频率&#xff0c;通过查手册可知&#xff0c;我使用的开发板时钟为50hz&#xff0c;也就是时钟一个周期是2微秒。 5000000…...

读书记录九之《在峡江的转弯处-陈行甲人生笔记》

距离上本读完的书&#xff0c;写读后感有很长一段时间了&#xff0c;中间读了几本书&#xff0c;但都没写点文字&#xff0c;没错&#xff0c;是懒病又犯了。陈行甲这本书&#xff0c;一开始从网络上推荐看到&#xff0c;看之前介绍是一本人物自传的回忆录。我个人对这类贴近的…...

可视化开发:用Qt实现Excel级动态柱状图

Qt柱状图 QtChart 首先我们介绍一下 图表建立的基础&#xff1a;Qt Charts QtChart 是Qt框架的一个模块&#xff0c;专注与提供交互式数据可视化功能 俗话就是 用于用户轻松创建各种类型的图表和图形界面 它包含的图表类型有很多&#xff1a;折线图&#xff0c;饼图&#x…...

从零实现Json-Rpc框架】- 项目实现 - 基于Dispatcher模块的RPC框架

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

kubekey -实现懒人一键部署K8S集群

kubekey -实现懒人一键部署K8S集群 操作步骤 官网&#xff1a; https://kubesphere.io/zh/ 一、执行以下命令快速创建一个 Kubernetes 集群。 Master节点 如果您访问 GitHub/Googleapis 受限&#xff0c;请登录 Linux 主机&#xff0c;执行以下命令设置下载区域。 [roottest ~]…...

Android设计模式之模板方法模式

一、定义&#xff1a; 定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 二、结构&#xff1a; AbstractClass抽象类&#xff1a;定义算法的骨架&#xff0c;包含模板方法和若干…...

李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念

机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值&#xff1a;label MAE MSE 几率分布&#xff0c;cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小&#xff0c;找导数为零的点 单独考虑w&#xff0c;w…...

数字IC后端项目常见问题之streamOut layermap和innovus drc violation

Q1&#xff1a;我需要将Innovus设计GDS导出到Virtuoso&#xff0c;但发现写出GDS的过程会报如下所示的警告。这里写出GDS使用的是Virtuoso (DFII) streamOut mapping文件&#xff01; Clock Gen模块Routing DRC&#xff0c;Timing分析及解决 streamOut tease.gds2 -mapFile cd…...

短剧系统开发动漫短剧系统源码开发上线小程序app教程

一、市场规模与用户增长&#xff1a;突破677亿&#xff0c;Z世代成主力 整体扩张 2025年短剧市场预计同比增长15%&#xff0c;规模达677.9亿元&#xff0c;用户规模6.62亿&#xff08;占网民59.7%&#xff09;。动漫短剧作为细分领域&#xff0c;增速显著受益于二次元文化渗透&…...

太阳能高杆路灯:照亮未来的新光

在全球能源转型进程加速以及可持续发展理念日益深入人心的背景下&#xff0c;太阳能高杆路灯作为融合新能源技术、智能控制技术与多功能集成特性的创新产品&#xff0c;正逐步革新传统路灯的格局。其不仅有效解决了传统路灯对电网供电的依赖问题&#xff0c;更为城市及乡村的照…...

《C++Linux编程进阶:从0实现muduo 》-第8讲.C++面试如何高效获取线程ID

章节重点 在C面试时&#xff0c;经常被问到如果高效获取线程ID&#xff0c;但不少同学都不知道如何回答。 重点是通过__thread关键字。 重点内容 视频讲解&#xff1a;《CLinux编程进阶&#xff1a;从0实现muduo C网络框架系列》-第8讲. C面试如何高效获取线程ID 测试获取线…...