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

OpenCV 图形API(或称G-API)

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

引言

OpenCV 图形API(或称G-API)是一个新的OpenCV模块,旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行模型来实现这两个目标。

G-API是OpenCV中的一个特殊模块——与其他大多数主要模块不同,其他模块专注于提供具体的计算机视觉算法,而这个模块则充当框架的角色。G-API提供了定义计算机视觉操作的方法,使用这些操作以表达式的形式构造图,并最终为特定后端实现和运行这些操作。

注意:
G-API是一个新模块,目前正处于积极开发中。它的API目前还不稳定,未来可能会有一些虽小但却可能影响兼容性的变化。
内容

G-API文档组织如下章节:

  • 为什么需要图形API?

    G-API背后的动机及其目标。

  • 高层次设计概览

    G-API架构的一般概述及其主要内部组件。

  • 内核API

    学习如何在G-API中引入新的操作并在各种后端上实现它们。

  • 实现细节

    G-API的底层实现细节,适用于那些想要贡献代码的人。

  • API参考:函数和类

    • G-API核心功能

      核心G-API操作 - 算术、布尔和其他矩阵操作;

    • G-API图像处理功能

      图像处理函数:色彩空间转换、各种滤镜等。

我会按章节来一篇一篇的写,祝愿自己能写完!!!

API 示例

下面展示了一个非常基础的G-API管道示例:


#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>
int main( int argc, char* argv[] )
{cv::VideoCapture cap;if ( argc > 1 )cap.open( argv[ 1 ] );elsecap.open( 0 );CV_Assert( cap.isOpened() );cv::GMat in;cv::GMat vga     = cv::gapi::resize( in, cv::Size(), 0.5, 0.5 );cv::GMat gray    = cv::gapi::BGR2Gray( vga );cv::GMat blurred = cv::gapi::blur( gray, cv::Size( 5, 5 ) );cv::GMat edges   = cv::gapi::Canny( blurred, 32, 128, 3 );cv::GMat b, g, r;std::tie( b, g, r ) = cv::gapi::split3( vga );cv::GMat out        = cv::gapi::merge3( b, g | edges, r );cv::GComputation ac( in, out );cv::Mat input_frame;cv::Mat output_frame;CV_Assert( cap.read( input_frame ) );do{ac.apply( input_frame, output_frame );cv::imshow( "output", output_frame );} while ( cap.read( input_frame ) && cv::waitKey( 30 ) < 0 );return 0;
}

运行结果

  • G-API 是一个独立的 OpenCV 模块,所以需要显式包含它的头文件。
    在 main() 函数的开头,首先创建并初始化了 OpenCV 的标准视频捕捉对象,用于从连接的摄像机或指定文件中获取视频帧。
  • 接着构建 G-API 管道,实际上是针对 cv::GMat 数据的一系列 G-API 操作调用。需要注意的是,这一段代码仅仅是定义了要执行的动作,而并没有实际执行它们。此时没有进行任何处理,G-API 只是记录下了哪些操作组成了管道以及它们是如何连接在一起的。G-API 数据对象(这里是 cv::GMat)用于连接不同的操作。in 作为一个空的 cv::GMat 标识了计算的起点。
  • 在编写完 G-API 代码后,通过实例化 cv::GComputation 对象来捕获这些操作形成一个调用图。这个对象接受输入和输出数据引用(本例中分别是 in 和 out 的 cv::GMat 对象),并根据 in 和 out 之间的所有数据流重建调用图。
  • cv::GComputation 是一个轻量级的对象,它仅仅捕获了组成一次计算的操作。不过,它可以用来执行计算——在后续的处理循环中,每一个捕获到的帧(即 cv::Mat input_frame)都会被传递给 cv::GComputation::apply() 方法进行处理。

在这里插入图片描述

cv::GComputation::apply() 是一个支持多态的方法,它可以接受可变数量的参数。由于这里的计算是基于一个输入和一个输出定义的,因此使用了 cv::GComputation::apply() 的特殊重载版本来传递输入数据并获取输出数据。

在内部,cv::GComputation::apply() 会为给定的输入参数编译捕获的图,并立即在数据上执行编译后的图。

通过这个示例,可以概述一些重要的概念:

  • 图声明和图执行是独立的步骤:首先声明图(即定义操作流程),然后在需要的时候执行它。
  • 图是从一系列G-API表达式中隐式构建的:不需要手动创建复杂的图结构,而是通过一系列函数调用来描述处理流程,G-API会自动将其转换为相应的图。
  • G-API支持类似函数的调用和操作符:例如 cv::gapi::resize() 这样的函数调用,以及用于计算按位或的操作符 operator|()。
  • G-API语法旨在保持纯粹性:图中的每个操作调用都会产生一个新的结果,从而形成一个有向无环图(DAG)。
  • 图声明不绑定到任何数据:实际的数据对象(如 cv::Mat)是在图已经声明之后才进入过程的。

查看教程和移植示例以了解更多关于各种G-API功能和概念的信息。

相关文章:

OpenCV 图形API(或称G-API)

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 引言 OpenCV 图形API&#xff08;或称G-API&#xff09;是一个新的OpenCV模块&#xff0c;旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行…...

数据设计(范式、步骤)

文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式&#xff0c;指导如何设计一个关系型数据库。 1NF&#xff1a; 关系表的每个字段&#xff0c;都应该是不可再分的&#xff0c;——保证原子性。 字…...

Linux命令大全:从入门到高效运维

适合人群&#xff1a;Linux新手 | 运维工程师 | 开发者 目录 一、Linux常用命令&#xff08;每天必用&#xff09; 1. 文件与目录操作 2. 文件内容查看与编辑 二、次常用命令&#xff08;按需使用&#xff09; 1. 系统管理与监控 2. 网络与通信 3. 权限与用户管理 三、…...

系统与网络安全------网络应用基础(3)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 路由器 路由器认识路由器工作原理基本配置直连路由远程管理路由器远程连接测试 路由器 认识路由器 负责在不同网络之间转发数据的设备 路由器决定到达目标的路径 路由器也为直连网络的主机充当”网关“角色…...

常用的测试用例

登录、添加、删除、查询模块是我们经常遇到的&#xff0c;这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求&#xff0c;密码不符合要求(格式上的要求) ④ 密码符合要求&#xf…...

标准库中有uint32_t类型吗?

标准 C 库中有uint32_t类型。它定义在<stdint.h>头文件中&#xff0c;表示无符号 32 位整数类型。 #include <stdio.h> #include <stdint.h>int main() {uint32_t num 4294967295; // 32位无符号整数的最大值printf("The value of num is %u\n"…...

作业(7)

接口ip配置和区域划分&#xff1a; fw1&#xff1a; [fw1]interface GigabitEthernet 0/0/0 [fw1-GigabitEthernet0/0/0]service-manage all permit [fw1]firewall zone trust [fw1-zone-trust]add interface GigabitEthernet 1/0/0 [fw1]security-policy [fw1-policy-secu…...

kafka 报错消息太大解决方案 Broker: Message size too large

kafka-configs.sh --bootstrap-server localhost:9092 \ --alter --entity-type topics \ --entity-name sim_result_zy \ --add-config max.message.bytes10485880 学习营课程...

Burp Suite抓包实战:SQL注入漏洞挖掘

本文系统解析如何利用Burp Suite专业版开展SQL注入漏洞的定向挖掘&#xff0c;涵盖手动探测、自动化利用、WAF绕过等进阶技巧。通过电商、金融等行业的真实渗透案例&#xff0c;详解从流量拦截到漏洞利用的全链路方法论&#xff0c;实现单日最高挖掘23个高危注入点的实战成果。…...

open-cv的安装

python -m pip install numpy matplotlib opencv-python 【记得科学上网&#xff0c;不然太慢了】...

docker-compose自定义网络,解决docker-compose网段路由冲突

问题排查 先route一波查看一下路由表 容器路由19和堡垒机路由冲突 解决方案 更改docker网段更改docker生成容器的网段 > 基本操作 docker network ls &#xff1a;查看docker网络列表 docker network inspect <network id/name>&#xff1a;查看某个docker网络详情…...

数据库三级选择题(2)

C) 分布式数据库的事务管理包括恢复控制和并发控制&#xff0c;恢复控制一般采用的策略是基于两阶段提交协议 采用一定的计算方法定位数据的有 Ⅳ&#xff0e;散列&#xff08;哈希&#xff09;索引 下列提供逻辑独立性的是外模式/模式映像 UML所有活动有关判断的部分要用菱形表…...

【入门初级篇】报表基础操作与功能介绍

【入门初级篇】报表的基本操作与功能介绍 视频要点 &#xff08;1&#xff09;报表组件的创建 &#xff08;2&#xff09;指标组件的使用&#xff1a;一级、二级指标操作演示 &#xff08;3&#xff09;表格属性设置介绍 &#xff08;4&#xff09;图表属性设置介绍 &#xff0…...

GenBI 中如何引入 LLM 做意图路由,区分查数据还是闲聊

写在前面 生成式商业智能(Generative BI, GenBI)的魅力在于其能够理解用户的自然语言,并将复杂的数据查询和分析过程自动化。用户不再需要学习 SQL 或操作复杂的界面,只需像与同事交谈一样提出问题,就能获得数据洞察。然而,一个现实的挑战是:用户的输入并非总是明确的数…...

视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验

264、x265、libaom、vvenc 对比测试实验 测试机器配置&#xff1a;Apple M1 Pro -16G编码器版本&#xff08;选择自己编译&#xff09;&#xff1a;所有源码都是当前最新更新的状态&#xff0c;此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…...

【多媒体交互】Unity Kinect实现UI控件的点击

在Unity中&#xff0c;通过Kinect实现UI控件的点击功能&#xff0c;主要涉及手部追踪、坐标映射和手势检测三个核心环节。 实现步骤 初始化Kinect与关节追踪 使用KinectManager获取用户ID和手部关节点&#xff08;如JointType.HandLeft&#xff09;的坐标。 long userId _…...

vue将页面导出成word

方法一&#xff1a;使用 html-docx-js html-docx-js 是一个轻量级的库&#xff0c;可以将 HTML 转换为 Word 文档。 安装依赖 首先安装 html-docx-js&#xff1a; Bash深色版本 npm install html-docx-js --save创建导出逻辑 在 Vue 组件中实现导出功能的代码如下&#xff1…...

React 知识回顾(HOC、合成事件、Fiber)

HOC 嗯&#xff0c;用户问的是HOC是什么以及它能用来做什么。我需要先理解HOC的基本概念&#xff0c;然后整理它的用途。根据搜索结果&#xff0c;HOC是React中的高阶组件&#xff0c;用来复用逻辑。网页1提到HOC是一个函数&#xff0c;接收组件返回新组件&#xff0c;属于设计…...

hive相关面试题以及答案

什么是Hive&#xff1f;它的作用是什么&#xff1f; 答&#xff1a;Hive是一个建立在Hadoop之上的数据仓库工具&#xff0c;它提供了类似于SQL的查询语言HiveQL来操作存储在Hadoop中的数据。Hive的主要作用是让用户能够使用SQL语法来查询和分析大规模数据集。 Hive的架构是什么…...

Jmeter-负载测试

目录 一. 基础负载测试场景&#xff1a;固定并发用户数 1、线程组配置 2、HTTP请求配置 3、添加定时器 4、添加监听器 4.1 聚合报告 4.2 响应时间图 4.3 查看结果树 5、结果分析指标 二. 阶梯式加压场景&#xff08;逐步增加并发&#xff09; 1、插件安装 2、阶梯配…...

《深度剖析SQL数据类型转换:隐式与显式的奥秘》

在SQL的世界里&#xff0c;数据类型转换是一个基础且关键的操作&#xff0c;它贯穿于数据库开发、管理与数据分析的各个环节。数据类型转换分为隐式转换和显式转换&#xff0c;二者各有特点与应用场景&#xff0c;深刻理解它们对于编写高效、稳定的SQL代码至关重要。 一、数据…...

基于大模型的自发性气胸全方位预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测自发性气胸的原理及技术基础 2.1 大模型介绍 2.2 模型构建与训练数据 2.3 模型训练与优化 三、术前风险预测与准备 3.1 术前风险预测指标 3.2 基于预测的术前准备 3.3 手术方案与麻醉方案制定…...

经销商订货管理系统小程序PHP+uniapp

订货管理系统的行业变革势能 在实体商业与电商融合加速的2025年&#xff0c;订货管理系统已成为连锁品牌、商贸批发企业及工厂客户的核心数字化基建。面对经销商订货流程冗长、加盟商库存协同低效、批发贸易数据孤岛等行业痛点&#xff0c;新一代系统通过ThinkPHPUniapp技术架…...

性能测试理论基础-测试流程及方案设计要点

需求调研 因性能测试技术性和专业性要求比较高,通常需要性能测试人员参与需求调研和确认。 需求调研阶段,通常需要确认以下信息: 项目背景、测试范围、业务逻辑 & 数据流转(与开发确认)、系统架构、软硬件配置信息、 测试数据量(量级要一致)、外部依赖(第三方系统…...

TextGrad:案例

原文&#xff1a;Yuksekgonul, M., Bianchi, F., Boen, J. et al. Optimizing generative AI by backpropagating language model feedback. Nature 639, 609–616 (2025). https://doi.org/10.1038/s41586-025-08661-4 目录 Solution optimizationPrompt optimization for rea…...

kafka 4.x docker启动kafka4.0.0 docker-compose启动最新版kafka 如何使用docker容器启动最新版kafka

1. 镜像选择标签&#xff1a; https://hub.docker.com/r/bitnami/kafka/tags 2. 命令&#xff1a; docker pull bitnami/kafka:4.0.0 3. docker-compose.yml 启动kafka4.0.0&#xff1a; version: 3services:kafka:image: bitnami/kafka:4.0.0container_name: kafkaports:- &…...

Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927) 复现利用与原理分析

免责声明 本文所述漏洞复现方法仅供安全研究及授权测试使用&#xff1b; 任何个人/组织须在合法合规前提下实施&#xff0c;严禁用于非法目的&#xff1b; 作者不对任何滥用行为及后果负责&#xff0c;如发现新漏洞请及时联系厂商并遵循漏洞披露规则。 漏洞原理 Next.js 是一个…...

C#Lambda表达式与委托关系

1. 核心关系图示 A[委托] --> B[提供方法容器] B --> C[Lambda表达式] C --> D[委托实例的语法糖] A --> E[类型安全约束] C --> F[编译器自动生成委托实例] 2. 本质联系 2.1 类型关系 ‌Lambda表达式‌是编译器生成的‌委托实例‌表达式自动匹配符合签名的…...

AOA与TOA混合定位,MATLAB例程,自适应基站数量,三维空间下的运动轨迹,滤波使用EKF

本代码实现了一个基于 到达角(AOA) 和 到达时间(TOA) 的混合定位算法,结合 扩展卡尔曼滤波(EKF) 对三维运动目标的轨迹进行滤波优化。代码通过模拟动态目标与基站网络,展示了从信号测量、定位解算到轨迹滤波的全流程,适用于城市峡谷、室内等复杂环境下的定位研究。 文…...

Uni-app入门到精通:subPackages节点为小程序的分包加载配置

subPackages节点用于为小程序的分包加载配置。因小程序有体积和资源加载限制&#xff0c;各小程序平台提供了分包方式&#xff0c;以加快小程序的下载和启动速度。主包用于放置默认启动页面、babBar页面&#xff0c;以及一些所有分包都会用到的公共资源或JS脚本&#xff1b;而分…...