OpenCV 4.13.0
開源電腦視覺 (Open Source Computer Vision)
載入中...
搜尋中...
無符合項
圖形 API (Graph API)

簡介

OpenCV 圖形 API (G-API) 是一個新的 OpenCV 模組,旨在使常規影像處理更加快速且具備可移植性。這兩個目標是透過引入一種基於圖形 (graph-based) 的執行模型來實現的。

G-API 是 OpenCV 中的一個特殊模組——與大多數其他主要模組不同,它更像是一個框架,而非單一特定的 CV 演算法。G-API 提供了定義 CV 操作、使用這些操作構建圖形(以表達式形式),以及為特定後端實作並執行這些操作的方法。

備註
G-API 是一個新模組,目前正處於活躍開發階段。其 API 目前仍不穩定,未來可能會出現一些雖小但會破壞相容性的變更。

目錄

G-API 文件分為以下章節:

API 範例

以下展示一個極基礎的 G-API 管線 (pipeline) 範例:

#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 個單頻道矩陣建立一個 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 物件將其擷取到一個呼叫圖 (call graph) 中。該物件將輸入/輸出資料參照(在本例中分別為 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())以及運算子(例如用於計算位元運算 OR 的 operator|());
  • G-API 語法旨在保持純淨:圖形中的每個操作呼叫都會產生一個新的結果,從而形成一個有向無環圖 (DAG);
  • 圖形聲明不綁定任何資料——真實的資料物件(cv::Mat)是在圖形聲明完成後才引入的。

請參閱 教學與移植範例 以了解更多關於各種 G-API 功能與概念的資訊。