- 操作系统: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功能和概念的信息。