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 功能和概念的資訊。