Fari

G-Api

OpenCV 中的 Graph API 介绍

快速认知

例如 OpenCV 中的 cv::Canny(…),可以改用 G-API 写成 cv::gapi::Canny(…)

为了让图像处理过程更快,并且让代码有更好的可移植性,OpenCV引入了Graph API这个单独的模块。顾名思义,这是一种基于图的计算方式。这里图的概念类似于pytorch中图的概念。

例如,若一张图片的处理过程(pipeline)为:

resize -> 灰度化 -> 模糊处理 -> 边缘检测 -> 结果

没有图之前的做法是一步一步对某张图片进行处理,有了图之后就相当于将这些步骤单独封装成一个方法,需要处理的时候调用该方法即可得到最终结果。那么这和我直接将这些步骤封装成一个方法有什么区别呢?

直接封装成一个方法其本质还是对图像按整个过程一步一步处理

而将其封装成图之后,编译器会对整个pipeline做一系列优化,例如去除某些不必要的步骤或增加一些操作等等。

如何创建图?

# 注意这里引入的是gapi模块
#include <opencv2/highgui.hpp>
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>

// 构建图,注意数据结构为 GMat
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 out      = cv::gapi::Canny(blurred, 32, 128, 3);
cv::GComputation ac(in, out);

// 使用图,注意数据结构为 Mat
cv::Mat output, input = cv::imread("pic-loction");
ac.apply(input, output); // 编译图并运行
cv::imshow("output", output);

G-API架构

基础架构图: