OpenCV 图形API(2)为什么需要图形API?

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

G-API背后的动机

G-API模块为OpenCV带来了基于图的执行模型。本章简要描述了这种新模型如何在两个方面帮助软件开发者:优化和移植图像处理算法。

使用Graph API进行优化

传统上,OpenCV提供了大量的独立图像处理函数(参见core和imgproc模块)。许多函数都经过了良好的优化(例如,针对特定CPU进行了向量化、并行化等),但是开箱即用的优化范围仅限于单个函数——构建在这些函数之上的整个算法的优化是程序员的责任。

OpenCV 3.0引入了透明API(或T-API),它允许透明地将OpenCV函数调用卸载到OpenCL设备,并通过cv::UMat减少主机/设备数据传输——这是向前迈出的一大步。然而,T-API是一个动态API——用户代码仍然不受约束,OpenCL内核以任意顺序排队,因此消除了进一步的流水线级别优化潜力。

G-API为OpenCV 4.0带来了隐式的图模型。图模型捕获流水线中的所有操作及其数据依赖关系,从而为G-API框架提供了额外的信息来进行流水线级别的优化。

基于图的优化的核心是分块(Tiling)。分块允许将处理分解为较小的部分并重新组织操作以启用数据并行性、改善数据局部性并节省内存占用。由于现代计算机架构中内存访问的不同成本,数据局部性是软件优化的一个特别重要的方面——在第一级缓存中重用的数据越多,流水线就越高效。

当然,上述技术可以手动应用——但这需要额外的技能和对目标平台的了解,且算法实现会变得不可逆地更加具体、灵活性降低、更难扩展和维护。

G-API从用户那里接手了这一责任和复杂性,并自行完成了大部分工作,保持算法代码免受设备或优化细节的影响。然而,这种方法也有其自身的局限性,因为图模型是一种受限模型,并非每个算法都可以表示为图,所以G-API的范围仅限于常规图像处理——各种滤镜、算术运算、二进制操作以及定义明确的几何变换。

使用Graph API进行移植

G-API的本质在于声明一系列要运行的操作,然后执行该序列。G-API是一个受限的API,因此它对哪些操作可以形成一个流水线以及这些操作之间可以交换哪些数据施加了一些限制。

实际上,这种形式化有助于使算法具有可移植性。G-API清晰地分离了操作接口与其实现。

一个操作(内核)可能有多个实现,甚至在同一设备上(例如,基于OpenCV的“参考”实现和分块优化的实现,两者都在CPU上运行)。在G-API术语中,图(或计算)仅使用操作接口构建,而不是使用实现——因此相同的图可以在不同的设备上执行(当然,也可以使用不同的优化技术),而几乎不需要改变图本身。

G-API支持插件(后端),这些插件聚集了关于在特定平台上最佳执行方式的逻辑和智能。一旦使用G-API构建了一个流水线,就可以参数化以使用其中任何一种后端(或它们的组合),从而使图能够轻松移植到新平台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring AI开发本地Jenkins MCP Server服务

前言 首先介绍下MCP是什么? MCP是由开发了 Claude 模型的 Anthropic 公司2024年12月提出并开源的一项开放标准,全称:Model Context Protocol,它是一个开放协议,它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能…

vcpkg安装指定版本的库

一.vcpkg安装 使用git将vcpkg源码克隆到本地制定目录(D:\vcpkg),并初始化 git clone https://github.com/microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh # Linux/macOS .\bootstrap-vcpkg.bat # Windows 如下图: 二.安…

数据结构C语言练习(单双链表)

本篇练习题(单链表): 1.力扣 203. 移除链表元素 2.力扣 206. 反转链表 3.力扣 876. 链表的中间结点 4.力扣 21. 合并两个有序链表 5. 牛客 链表分割算法详解 6.牛客 链表回文结构判断 7. 力扣 160. 相交链表 8. 力扣 141 环形链表 9. 力扣 142 环形链表 II…

nginx部署前端项目(linux、docker)

引言 在CentOS 7系统上使用docker安装nginx,使用nginx部署一个由Vue开发、打包的项目 docker安装nginx 这里不多赘述,直接上docker-compose.yml代码 nginx:container_name: nginximage: nginx:1.27.2ports:- "80:80"volumes:- /docker/ngin…

WPF ContentPresenter详解2

ContentPresenter与ContentControl的区别 ContentControl 和 ContentPresenter 是 WPF 中两个相关的控件,但它们在用途和功能上有一些关键的区别。理解这两者的区别和联系有助于更好地设计和开发用户界面。 1. 类层次结构 ContentControl:位于 WPF 控件…

【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解

《从咖啡杯到财务自由:一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 🌟 这是小游戏开发系列的第四篇送福利文章,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之…

鸿蒙OS 5.0 服务能力框架深入剖析

鸿蒙OS 5.0 服务能力框架中关键类的作用分析 1\. 鸿蒙OS 5.0 服务能力框架导论 鸿蒙OS 5.0,亦称鸿蒙智联 5 1,标志着华为在分布式操作系统领域迈出的重要一步。与早期版本采用兼容安卓的AOSP层、Linux内核以及LiteOS内核不同,鸿蒙OS 5.0 专注…

RTMP推流+EasyDSS云服务+边缘AI分析的无人机监控系统设计

在现代科技不断发展的背景下,无人机技术已经广泛应用于各个领域,从航拍摄影到工业巡检,从农业监测到应急救援,无人机以其高效的工作能力,为人们的生活和工作带来了诸多便利与创新,而其视频传输与分析系统更…

HCIP(VLAN综合实验)

实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机(SW1、SW2、SW3)个人电脑(PC1、PC2、PC3、PC4、PC5、PC6)路由器(R1…

Linux系统编程 | 线程的基本概念

💓个人主页:mooridy 💓专栏地址:Linux 关注我🌹,和我一起学习更多计算机的知识! 🔝🔝🔝 什么是线程 程序中的一个执行路线就叫做线程 一个进程至少要有一个执行线程,单…

小林coding-12道Spring面试题

1.说一下你对 Spring 的理解?spring的核心思想说说你的理解? 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc?依赖倒置,依赖注入,控制反转分别是什么?依赖注…

第十二章——位运算

按位的与& 若x的第i位和y的第i位都是1,那么(x&y)1,否则(x&y) 0 应用:希望让某一位或某些位为0 。取一个数中的一段。 按位的或| 若x的第i位1或y的第i位1,那么&…

计算机等级考试数据库三级(笔记3)

插入 修改 现要创建一个具有如下功能的触发器:每当在销售表中插入一条销售记录时,修改商品表中对应商品的销售总量,假设一次只插入一条销售记录。请补全下列代码。CREATE TRIGGER tri insert on xx FOR xx AS xx 商品表 xx 销售总量xx (SELEC…

【Leetcode 每日一题】2716. 最小化字符串长度

问题背景 给你一个下标从 0 0 0 开始的字符串 s s s,重复执行下述操作 任意 次: 在字符串中选出一个下标 i i i,并使 c c c 为字符串下标 i i i 处的字符。并在 i i i 左侧(如果有)和 右侧(如果有&…

Flutter中实现拍照识题的功能

文章目录 **1. 功能拆解****2. 具体实现步骤****(1) 拍照或选择图片****(2) 图片预处理(可选)****(3) 文字识别(OCR)****(4) 数学公式识别 → LaTeX****方案1:Mathpix API(高精度,付费&#xff…

【Mysql:内置函数】

日期函数: 查看当前日期: select current_date();查看当前时间: select current_time(); 查看当前时间戳: select current_timestamp(); 计算两个日期的差值: select datediff(date1,date2); 当前的日期时间&a…

71. 我的第一个Linux驱动实验

一、字符设备驱动框架 字符设备驱动的编写主要就是驱动对应的open、close、read。。。其实就是 file_operations结构体的成员变量的实现。 其中关于 C 库以及如何通过系统调用“陷入” 到内核空间这个我们不用去管,我们重点关注的是应用程序和具体的驱动&#xff0…

jdk21使用Vosk实现语音文字转换,免费的语音识别

1.下载vosk的model vosk官网&#xff1a;https://alphacephei.com/vosk/models 我这里使用较小的vosk-model-small-cn-0.22 2.添加相关pom文件 <!-- 获取音频信息 --><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifac…

如何一键安装所有Python项目的依赖!

在开发项目时&#xff0c;常常需要在多个环境中安装各种依赖。对开发者来说&#xff0c;每次手动一个个安装这些依赖是不是很麻烦&#xff1f;&#x1f605; 其实有个超简单的办法&#xff01;只需要一个脚本&#xff0c;就能快速解决问题&#xff01;&#x1f4a1; 这就是我们…

Blender配置渲染设置并输出动画

在Blender中&#xff0c;渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤&#xff1a; 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板&#xff08;按 N 键可切换显示&#xff09;。 点击 “输出属性” 选项卡&#xff08;图标是…