OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
图形 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:840
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:786
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))
使用归一化框式滤波(normalized box filter)模糊图像。
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(),以及运算符,例如 operator|() 用于计算按位 OR;
  • G-API 的语法旨在看起来纯粹:图中的每个操作调用都会产生一个新结果,从而形成一个定向无环图 (DAG);
  • 图的声明不绑定到任何数据——真正的*数据对象*(cv::Mat)在图声明后才进入画面。

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