OpenCV 圖形API(3)高層次設計概覽

  • 操作系統:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 編程語言:C++11

描述

G-API 是一個異構框架,提供了統一的 API 來使用多個支持的后端編程圖像處理流水線。

關鍵的設計理念是在指定使用哪些內核和設備時保持流水線代碼本身的平臺中立性,這通過在圖編譯(配置)時使用額外的參數來實現。這一要求導致了如下架構:
在這里插入圖片描述

G-API 框架架構
在這一架構中有三個層次:
  • API層 – 這是頂層,實現了G-API的公共接口、其構建塊及其語義。當用戶使用G-API構建一個流水線時,他直接與此層交互,用戶操作的實體(如cv::GMat或cv::GComputation)由這一層提供。

  • 圖編譯器層 – 這是中間層,它將用戶的計算展開成圖,然后對其應用一系列轉換(例如優化)。這一層建立在ADE框架之上。

  • 后端層 – 這是最底層,列出了多個后端。與上述兩層相比,后端與低級平臺細節高度耦合,每個后端代表一個特定的平臺。后端對來自圖編譯器的處理過的圖進行操作,并針對特定平臺或設備最優地執行這個圖。

API層

API層是用戶在定義和使用流水線(在G-API術語中稱為計算)時直接交互的部分。API層定義了一組G-API動態對象,這些對象可以用作圖中的輸入、輸出和中間數據對象:

  • cv::GMat
  • cv::GScalar
  • cv::GArray(模板類)

API層還指定了可以應用于這些數據對象的一系列操作——即所謂的內核。有關G-API默認提供的操作的詳細信息,請參見G-API的核心和imgproc命名空間。

G-API不限于這些操作——用戶可以使用特殊的宏G_TYPED_KERNEL()輕松定義自己的內核。

API層還負責在創建流水線時對操作參數進行編組和存儲。除了上述提到的G-API動態對象外,操作還可以接受任意參數(更多詳情見此處),因此API層會在執行時捕獲這些值并內部存儲。

最后,cv::GComputation和cv::GCompiled是API層中剩余的重要組件。前者將一系列G-API表達式封裝到一個對象(圖)中,而后者是圖編譯的產物(詳見此章節)。

圖編譯器層

每個G-API計算在執行之前都會被編譯。編譯過程通過兩種方式觸發:

  • 隱式編譯,當使用cv::GComputation::apply()時觸發。在這種情況下,圖編譯緊接著立即執行。
  • 顯式編譯,當使用cv::GComputation::compile()時觸發。這種情況下,將返回一個cv::GCompiled對象,該對象可以像C++函數對象一樣被調用。

第一種方式適用于輸入數據格式事先未知的情況——例如,當數據來自任意輸入文件時。第二種方式推薦用于部署(生產)場景,在這些場景中,輸入數據特征通常是預定義的。

圖編譯過程建立在ADE框架之上。最初,根據API層捕獲的表達式生成一個二分圖。這個圖包含兩種類型的節點:數據和操作。圖總是以一個或多個數據節點開始和結束,其間是操作節點。每個操作節點都有輸入和輸出,它們都是數據節點。

在初始圖生成之后,它實際上會經過一系列稱為“passes”的圖變換處理。ADE框架充當編譯pass管理引擎,而passes是專門為G-API編寫的。

存在不同的passes來檢查圖的有效性、細化操作和數據的細節、基于親和性或用戶指定的區域化[TBD]將節點組織成集群(“Islands”),等等。后端也能夠在編譯過程中注入特定于后端的passes,更多關于這方面的信息請參見專門的章節。

圖編譯的結果是一個編譯后的對象,由類cv::GCompiled表示。無論是否有顯式或隱式的編譯請求(見上文),都會創建一個新的cv::GCompiled對象。實際的圖執行是在cv::GCompiled內發生的,并由參與圖編譯的后端決定。

另請參閱:

  • cv::GComputation::apply()
  • cv::GComputation::compile()
  • cv::GCompiled

后端層

上述圖表列出了兩個后端:OpenCV和Fluid。OpenCV被稱為“參考后端”,它使用傳統的OpenCV函數實現G-API操作。這個后端對于在熟悉的開發系統上進行原型設計非常有用。Fluid是一個插件,用于在CPU上高效執行緩存——它實現了不同的執行策略,并使用其特有的內核。Fluid后端允許在CPU上運行時減少內存占用并提高內存局部性。

可能還有更多的后端可用,例如Halide、OpenCL等——G-API提供了一個統一的內部API來開發后端,因此任何愛好者或公司都可以自由地在新平臺或加速器上擴展G-API。在OpenCV基礎設施方面,每個新的后端都是一個新的獨立OpenCV模塊,當作為OpenCV的一部分構建時,它擴展了G-API。

圖執行

圖的執行方式由編譯時選擇的后端定義。實際上,每個后端在圖編譯過程的最終階段生成自己的執行腳本,即創建可執行(編譯)對象時。例如,在OpenCV后端中,這個腳本只是需要調用的OpenCV函數的拓撲排序序列;對于Fluid后端,情況類似——是每次迭代處理輸入行的代理(Agents)的拓撲排序列表。

圖執行通過兩種方式觸發:

  • 通過cv::GComputation::apply(),為給定的輸入數據即時編譯圖;
  • 通過cv::GCompiled::operator()(),當圖已被預編譯時使用。

這兩種方法都是多態的,接受變長參數列表,并在運行時執行有效性檢查。如果傳遞的數據對象的數量、形狀和格式與預期不符,則會拋出運行時異常。G-API還提供了類型包裝器,將這些檢查移到編譯時——參見cv::GComputationT<>。

G-API圖執行聲明為無狀態的——這意味著已編譯的函數對象(cv::GCompiled)就像一個純粹的C++函數一樣工作,并對相同的輸入參數集提供相同的結果。

這兩種執行方法都接受N+M個參數,其中N是輸入數量,M是在其上定義cv::GComputation的輸出數量。請注意,雖然在定義中使用了G-API類型(如cv::GMat等),但執行方法接受持有實際數據的傳統OpenCV數據類型(如cv::Mat)——參見參數編組中的表格。

另請參閱:
實現細節
內核API

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74110.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里云Tair KVCache:打造以緩存為中心的大模型Token超級工廠

一、Tair KVCache 簡介 Tair KVCache 是阿里云瑤池旗下云數據庫 Tair 面向大語言模型推理場景推出的 KVCache 緩存加速服務。 隨著互聯網技術的演進與流量規模的激增&#xff0c;緩存技術逐漸成為系統架構的核心組件。該階段催生了 Redis 等開源緩存數據庫&#xff0c;阿里巴巴…

Open GL ES ->GLSurfaceView正交投影與透視投影方法中近遠平面取值參考

坐標系 OpenGL ES使用右手坐標系&#xff0c;相機默認朝向負z方向 相機位置|vz軸<----- 0 -----> -near -----> -far -----不可見 可見區域 不可見裁剪規則 只有z值在[-near, -far]范圍內的物體可見&#xff0c; 當z > -near&#xff08;在近平面前&#…

iOS自定義collection view的page size(width/height)分頁效果

前言 想必大家工作中或多或少會遇到下圖樣式的UI需求吧 像這種cell長度不固定&#xff0c;并且還能實現的分頁效果UI還是很常見的 實現 我們這里實現主要采用collection view&#xff0c;實現的方式是自定義一個UICollectionViewFlowLayout的子類&#xff0c;在這個類里對…

Java高頻面試之并發編程-01

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天來報道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面試官&#xff1a;并行跟并發有什么區別&#xff1f; 并發 vs 并行&#xff1a;核心區別與場景 1. 定義對比 維度并發&#xff08;Concu…

從零開始學Rust:所有權(Ownership)機制精要

文章目錄 第四章&#xff1a;Ownership 所有權核心概念關鍵機制引用與借用&#xff08;Reference & Borrowing&#xff09;懸垂引用問題錯誤示例分析解決方案引用安全規則 切片&#xff08;Slice&#xff09;內存安全保證 第四章&#xff1a;Ownership 所有權 Ownership i…

一旦懂得,有趣得緊1:詞根tempt-(嘗試)的兩種解法

詞根tempt-嘗試 tempt vt.引誘&#xff1b;誘惑&#xff1b;慫恿&#xff1b;利誘&#xff1b;勸誘&#xff1b;鼓動 temptation n.引誘&#xff1b;誘惑 // tempt v.引誘 -ation 名詞后綴 attempt v.&n.嘗試&#xff0c;試圖 // at- 加強 tempt 嘗試contempt n.蔑視&am…

召喚數學精靈

1.召喚數學精靈 - 藍橋云課 問題描述 數學家們發現了兩種用于召喚強大的數學精靈的儀式&#xff0c;這兩種儀式分別被稱為累加法儀式 A(n) 和累乘法儀式 B(n)。 累加法儀式 A(n) 是將從1到 n 的所有數字進行累加求和&#xff0c;即&#xff1a; A(n)12?n 累乘法儀式 B(n) …

C語言實現查表8位SAE J1850 CRC

背景&#xff1a; 在做霍爾采集電流的時候&#xff0c;CSSV1500N 系列電流傳感器通過can數據輸出的報文需要做crc校驗&#xff0c;嵌入式常用查表的方式&#xff0c;所以就問了下deepseek怎么算這個CRC. 以下是使用 查表法&#xff08;Lookup Table&#xff09; 在C語言中高效…

【UE5.3.2】初學1:適合初學者的入門路線圖和建議

3D人物的動作制作 大神分析:3D人物的動作制作通常可以分為以下幾個步驟: 角色綁定(Rigging):將3D人物模型綁定到一個骨骼結構上,使得模型能夠進行動畫控制。 動畫制作(Animation):通過控制骨骼結構,制作出人物的各種動作,例如走路、跳躍、打斗等。 動畫編輯(Ani…

mapreduce的工作原理

MapReduce 是 Hadoop 中實現分布式并行計算的核心框架&#xff0c;其工作原理基于“分而治之”的思想&#xff0c;將大規模數據處理任務分解為 Map&#xff08;映射&#xff09; 和 Reduce&#xff08;歸約&#xff09; 兩個階段。 一、MapReduce 核心流程 1. Input 階段 - 輸…

換季推廣不好做?DeepBI用一鍵托管的方式,讓廣告投放跑得快、準、穩

每年換季&#xff0c;尤其是春夏、秋冬交替的節點&#xff0c;都是電商平臺上各類季節性商品扎堆上新的高峰期。無論是服飾鞋包、家居戶外&#xff0c;還是母嬰用品、美妝護膚&#xff0c;許多商品都有著強烈的“時間窗口效應”——一旦錯過了熱賣期&#xff0c;流量下滑迅速&a…

Qt5.14.2+Cmake使用mingw64位編譯opencv4.5成功圖文教程

? 一、下載安裝相關編譯環境軟件 1.1 Python3.8&#xff1a;安裝路徑:C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32 安裝包&#xff1a;python3.8.exe 1.2 QT5.14.2&#xff1a;安裝路徑:C:\Qt\Qt5.14.2 1.3 opencv4.5&#xff1a;解壓路徑D:\o…

OpenBMC:BmcWeb 處理http請求3 字典樹查找節點

OpenBMC:BmcWeb 處理http請求2 查找路由對象-CSDN博客 findRouteByPerMethod實際上是調用了perMethod.trie.find(url);來查找路由對象的 class Trie {struct FindResult{unsigned ruleIndex;std::vector<std::string> params;};FindResult findHelper(const std::string…

Openssl自簽證書相關知識

1.前提 檢查是否已安裝 openssl $ which openssl /usr/bin/openssl 2.建立CA授權中心 2.1.生成ca私鑰(ca-prikey.pem) 初始化 OpenSSL 證書頒發機構(CA)的序列號文件 在生成證書時,ca.srl 的初始序列號需正確初始化(如 01),否則可能導致證書沖突 這會將 01 顯示在屏幕…

K個一組翻轉鏈表--囊括半數鏈表題的思想

K 個一組翻轉鏈表 這道算法題就是鏈表多個算法思想的結合&#xff0c;解決這一道leetcodehot100的鏈表題至少能做一半了 大概有一下幾個點 1.鏈表定位 2.鏈表翻轉 3.哨兵節點 4.鏈表合并 看看題目 給你鏈表的頭節點 head &#xff0c;每 k 個節點一組進行翻轉&#xff…

Flutter敏感詞過濾實戰:基于AC自動機的高效解決方案

Flutter敏感詞過濾實戰&#xff1a;基于AC自動機的高效解決方案 在社交、直播、論壇等UGC場景中&#xff0c;敏感詞過濾是保障平臺安全的關鍵防線。本文將深入解析基于AC自動機的Flutter敏感詞過濾實現方案&#xff0c;通過原理剖析實戰代碼性能對比&#xff0c;帶你打造毫秒級…

UML中的用例圖和類圖

在UML&#xff08;統一建模語言&#xff09;中&#xff0c;**用例圖&#xff08;Use Case Diagram&#xff09;和類圖&#xff08;Class Diagram&#xff09;**是兩種最常用的圖表類型&#xff0c;分別用于描述系統的高層功能和靜態結構。以下是它們的核心概念、用途及區別&…

深入解析:HarmonyOS Design設計語言的核心理念

深入解析&#xff1a;HarmonyOS Design設計語言的核心理念 在當今數字化迅速發展的時代&#xff0c;用戶對操作系統的體驗要求越來越高。華為的HarmonyOS&#xff08;鴻蒙操作系統&#xff09;應運而生&#xff0c;旨在為用戶提供全場景、全設備的智慧體驗。其背后的設計語言—…

Vue 類與樣式

數據綁定的一個常見需求場景是操縱元素的 CSS class 列表和內聯樣式。因為 class 和 style 都是 attribute&#xff0c;我們可以和其他 attribute 一樣使用 v-bind 將它們和動態的字符串綁定。但是&#xff0c;在處理比較復雜的綁定時&#xff0c;通過拼接生成字符串是麻煩且易…

Android 中獲取顏色資源

在 Android 開發中&#xff0c;資源&#xff08;如字符串、顏色等&#xff09;通常存儲在 res 文件夾中&#xff0c;并通過資源 ID 進行訪問。資源 ID 是一個整型值&#xff0c;用于唯一標識資源&#xff0c;若需要將資源轉換為整型值&#xff0c;通常是指獲取資源 ID 或從資源…