作者:Parker2019
链接:https://www.jianshu.com/p/8c8c08496a2c
来源:简书
G-API的管线(pipeline:pipeline表示在外接程序与其宿主之间交换数据的管线段的线性通信模型。从宿主端开始,管线具有以下一系列管线段:宿主、外接程序的宿主视图、宿主端适配器、协定、外接程序端适配器、外接程序视图和外接程序。)随之被创建,事实上它是通过调用cv::GMat来完成一系列的G-API数据操作。它只是声明了要去做什么操作,而并不是直接执行什么操作。到此时也还没有进行任何的图像处理。G-API只追踪管线的操作以及其实如何连接的。G-API的数据对象(cv::GMat)是用以连接各种操作的。cv::GMat in则是一个为空的GMat信号,用于告知计算的开始。
然后实例化cv::GComputation这个对象。此对象把输入/输出(input/output)数据当做参数(在本例中依次是in和out这两个cv::GMat对象),并基于in和out的中的数据流来重建调用图。
在某种程度上,cv::GComputation是一个缩减对象,它负责捕捉何种图像处理操作来组成计算,并执行计算。
测试
Mat readImage = imread("F:\\T1_20210421172407477.tif");
Mat result;
//imwrite("",readImage);
double t1 = (double)getTickCount();
cvtColor(readImage, result, COLOR_RGB2GRAY);
blur(result, result, Size(5, 5));
Canny(result, result, 30, 150, 3);
double t2 = ((double)getTickCount()-t1)/getTickFrequency()*1000;
std::cout << "Run Time 1 "<<t2<<" ms\n";
cv::GMat in;
cv::GMat gray = cv::gapi::RGB2Gray(in);
cv::GMat imgBlur = cv::gapi::blur(gray, Size(5, 5));
cv::GMat out = cv::gapi::Canny(imgBlur, 30, 150, 3);
cv::GComputation ac(in, out);
t1 = (double)getTickCount();
ac.apply(readImage, result);
t2 = ((double)getTickCount() - t1) / getTickFrequency() * 1000;
std::cout << "Run Time 2 " << t2 << " ms\n";