- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
引言
OpenCV 圖形API(或稱G-API)是一個新的OpenCV模塊,旨在使常規圖像處理更快且更便攜。通過引入一種新的基于圖的執行模型來實現這兩個目標。
G-API是OpenCV中的一個特殊模塊——與其他大多數主要模塊不同,其他模塊專注于提供具體的計算機視覺算法,而這個模塊則充當框架的角色。G-API提供了定義計算機視覺操作的方法,使用這些操作以表達式的形式構造圖,并最終為特定后端實現和運行這些操作。
注意:
G-API是一個新模塊,目前正處于積極開發中。它的API目前還不穩定,未來可能會有一些雖小但卻可能影響兼容性的變化。
內容
G-API文檔組織如下章節:
-
為什么需要圖形API?
G-API背后的動機及其目標。
-
高層次設計概覽
G-API架構的一般概述及其主要內部組件。
-
內核API
學習如何在G-API中引入新的操作并在各種后端上實現它們。
-
實現細節
G-API的底層實現細節,適用于那些想要貢獻代碼的人。
注:這一部分仍在進行中,等完成了我們再來看文檔。 -
API參考:函數和類
-
G-API核心功能
核心G-API操作 - 算術、布爾和其他矩陣操作;
-
G-API圖像處理功能
圖像處理函數:色彩空間轉換、各種濾鏡等。
-
我會按章節來一篇一篇的寫,祝愿自己能寫完!!!
API 示例
下面展示了一個非常基礎的G-API管道示例:
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>
int main( int argc, char* argv[] )
{cv::VideoCapture cap;if ( argc > 1 )cap.open( argv[ 1 ] );elsecap.open( 0 );CV_Assert( cap.isOpened() );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 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;
}
運行結果
- G-API 是一個獨立的 OpenCV 模塊,所以需要顯式包含它的頭文件。
在 main() 函數的開頭,首先創建并初始化了 OpenCV 的標準視頻捕捉對象,用于從連接的攝像機或指定文件中獲取視頻幀。 - 接著構建 G-API 管道,實際上是針對 cv::GMat 數據的一系列 G-API 操作調用。需要注意的是,這一段代碼僅僅是定義了要執行的動作,而并沒有實際執行它們。此時沒有進行任何處理,G-API 只是記錄下了哪些操作組成了管道以及它們是如何連接在一起的。G-API 數據對象(這里是 cv::GMat)用于連接不同的操作。in 作為一個空的 cv::GMat 標識了計算的起點。
- 在編寫完 G-API 代碼后,通過實例化 cv::GComputation 對象來捕獲這些操作形成一個調用圖。這個對象接受輸入和輸出數據引用(本例中分別是 in 和 out 的 cv::GMat 對象),并根據 in 和 out 之間的所有數據流重建調用圖。
- cv::GComputation 是一個輕量級的對象,它僅僅捕獲了組成一次計算的操作。不過,它可以用來執行計算——在后續的處理循環中,每一個捕獲到的幀(即 cv::Mat input_frame)都會被傳遞給 cv::GComputation::apply() 方法進行處理。
cv::GComputation::apply() 是一個支持多態的方法,它可以接受可變數量的參數。由于這里的計算是基于一個輸入和一個輸出定義的,因此使用了 cv::GComputation::apply() 的特殊重載版本來傳遞輸入數據并獲取輸出數據。
在內部,cv::GComputation::apply() 會為給定的輸入參數編譯捕獲的圖,并立即在數據上執行編譯后的圖。
通過這個示例,可以概述一些重要的概念:
- 圖聲明和圖執行是獨立的步驟:首先聲明圖(即定義操作流程),然后在需要的時候執行它。
- 圖是從一系列G-API表達式中隱式構建的:不需要手動創建復雜的圖結構,而是通過一系列函數調用來描述處理流程,G-API會自動將其轉換為相應的圖。
- G-API支持類似函數的調用和操作符:例如 cv::gapi::resize() 這樣的函數調用,以及用于計算按位或的操作符 operator|()。
- G-API語法旨在保持純粹性:圖中的每個操作調用都會產生一個新的結果,從而形成一個有向無環圖(DAG)。
- 圖聲明不綁定到任何數據:實際的數據對象(如 cv::Mat)是在圖已經聲明之后才進入過程的。
查看教程和移植示例以了解更多關于各種G-API功能和概念的信息。