OpenCV 4.11.0
开源计算机视觉
加载中…
搜索中…
无匹配项
图API

简介

OpenCV 图API(或G-API)是OpenCV的一个新模块,旨在使常规图像处理更快、更便携。这两个目标是通过引入一种新的基于图的执行模型来实现的。

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

注意
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);
返回 0;
}
GComputation类表示一个捕获的计算图。GComputation对象构成…的边界。
定义 gcomputation.hpp:121
GMat类表示图中的图像或张量数据。
定义 gmat.hpp:68
N维稠密数组类
定义 mat.hpp:829
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
用于从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:766
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:359
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)
将三个单通道矩阵合并成一个三通道矩阵。
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 功能和概念的更多信息。