OpenCV  4.10.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:812
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
用于从视频文件、图像序列或相机捕获视频的类。
定义 videoio.hpp:731
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:342
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 个单通道矩阵创建 1 个 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(),以及运算符,例如运算符 |,用于计算按位或;
  • G-API 语法旨在看起来很纯净:图形中的每个操作调用都会产生一个新的结果,从而形成一个有向无环图 (DAG);
  • 图声明不绑定任何数据 - 真实数据对象(cv::Mat)在图声明后才会出现。

参见 教程和移植示例,了解有关各种 G-API 功能和概念的更多信息。