OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
图形API

简介

OpenCV 图形API(或G-API)是一个新的OpenCV模块,旨在使常规图像处理变得快速且可移植。通过引入一种新的基于图的执行模型,可以实现这两个目标。

G-API是OpenCV中的一个特殊模块——与大多数其他主要模块不同,它充当一个框架,而非特定的计算机视觉(CV)算法。G-API提供定义CV操作、使用它构建图(以表达式形式)、以及最终为特定后端实现和运行操作的方法。

注意
G-API是一个新模块,目前正在积极开发中。其API目前不稳定,未来可能会有轻微但破坏兼容性的更改。

目录

G-API文档分为以下章节

API示例

下面展示了一个非常基本的G-API管线示例

#include <opencv2/gapi.hpp>
int main(int argc, char *argv[])
{
if (argc > 1) cap.open(argv[1]);
else cap.open(0);
cv::GMat vga = cv::gapi::resize(in, cv::Size(), 0.5, 0.5);
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;
}
GComputation 类表示一个捕获的计算图。GComputation 对象为...形成边界。
定义 gcomputation.hpp:121
GMat 类表示图中的图像或张量数据。
定义 gmat.hpp:68
n 维密集数组类
定义 mat.hpp:830
用于指定图像或矩形大小的模板类。
Definition types.hpp:335
用于从视频文件、图像序列或摄像头捕获视频的类。
Definition videoio.hpp:772
virtual bool read(OutputArray image)
抓取、解码并返回下一个视频帧。
virtual bool open(const String &filename, int apiPreference=CAP_ANY)
打开视频文件、捕获设备或IP视频流以进行视频捕获。
virtual bool isOpened() const
如果视频捕获已初始化,则返回 true。
#define CV_Assert(expr)
在运行时检查条件,如果失败则抛出异常。
定义 base.hpp:423
GMat BGR2Gray(const GMat &src)
将图像从BGR色彩空间转换为灰度图像。
GMat Canny(const GMat &image, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false)
使用Canny算法在图像中查找边缘。
GMat blur(const GMat &src, const Size &ksize, const Point &anchor=Point(-1,-1), int borderType=BORDER_DEFAULT, const Scalar &borderValue=Scalar(0))
使用归一化盒式滤波器模糊图像。
std::tuple< GMat, GMat, GMat > split3(const GMat &src)
将3通道矩阵分成3个单通道矩阵。
GMat resize(const GMat &src, const Size &dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
调整图像大小。
GMat merge3(const GMat &src1, const GMat &src2, const GMat &src3)
从3个单通道矩阵创建一个3通道矩阵。
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3

G-API 是一个独立的 OpenCV 模块,因此其头文件必须显式包含。main() 的前四行创建并初始化了 OpenCV 的标准视频捕获对象,该对象从连接的摄像头或指定文件中获取视频帧。

接下来构建G-API管线。实际上,它是在 cv::GMat 数据上的一系列G-API操作调用。G-API的重要方面是,这段代码块仅仅是动作的声明,而不是动作本身。此时没有发生任何处理,G-API只跟踪哪些操作构成管线以及它们是如何连接的。G-API 数据对象(这里是 cv::GMat)用于连接操作。in 是一个 cv::GMat,表示它是计算的开始。

编写G-API代码后,它通过实例化 cv::GComputation 对象被捕获到一个调用图中。该对象将输入/输出数据引用(在此示例中,分别是 inout cv::GMat 对象)作为参数,并根据 inout 之间的所有数据流重建调用图。

cv::GComputation 是一个轻量级对象,它只捕获哪些操作构成一个计算。然而,它可用于执行计算——在下面的处理循环中,每个捕获的帧(一个 cv::Mat input_frame)都被传递给 cv::GComputation::apply()

在示例视频 'vtest.avi' 上运行的管线示例

cv::GComputation::apply() 是一个多态方法,它接受可变数量的参数。由于此计算定义为单输入、单输出,因此使用 cv::GComputation::apply() 的一个特殊重载来传递输入数据并获取输出数据。

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

通过此示例可以概述一些重要概念

  • 图的声明和图的执行是不同的步骤;
  • 图是根据一系列G-API表达式隐式构建的;
  • G-API 支持函数式调用——例如 cv::gapi::resize(),以及运算符,例如用于计算按位或的 operator|();
  • G-API 语法力求简洁:图中的每个操作调用都会产生一个新的结果,从而形成一个有向无环图(DAG);
  • 图的声明不与任何数据绑定——实际数据对象(cv::Mat)在图声明后才出现。

请参阅教程和移植示例,了解更多G-API的各种特性和概念。