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架构
基础架构图: