OpenCV 图形API(或称G-API)(1)

  • 操作系统: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管道示例:

cpp 复制代码
#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 ] );
    else
        cap.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功能和概念的信息。

相关推荐
GISer_Jing6 小时前
AI自动化工作流:智能驱动未来(升级研究生项目!!!)
人工智能·前端框架·自动化
草捏子6 小时前
Agent Skills:让 AI 一次学会、永远记住的能力扩展方案
人工智能
NocoBase6 小时前
【2.0 教程】第 1 章:认识 NocoBase ,5 分钟跑起来
数据库·人工智能·开源·github·无代码
后端小肥肠6 小时前
OpenClaw实战|从识图到公众号内容自动化,我跑通了完整链路
人工智能·aigc·agent
Elastic 中国社区官方博客6 小时前
快速 vs. 准确:衡量量化向量搜索的召回率
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
qq_381338507 小时前
【技术日报】2026-03-18 AI 领域重磅速递
大数据·人工智能
NocoBase7 小时前
开源项目管理工具选型指南(2026年最新)
人工智能·开源·无代码
feasibility.7 小时前
AI 爬虫高手养成:Openclaw+Scrapling 手动部署 + 采集策略(以Walmart 电商平台为例)
人工智能·爬虫·科技·机器人·agi·openclaw·scrapling
程序员老猫7 小时前
前端菜鸡狂喜!DeepSeek+Gemini,嘴炮出完整博客方案
人工智能
AI周红伟8 小时前
周红伟:《OpenClaw安全防控:OpenClaw++Skills智能体安全部署、实操和企业应用实操》
人工智能·阿里云·云计算·腾讯云·openclaw