OpenCV中适用华为昇腾(Ascend)后端的逐元素操作(Per-element Operations)
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
针对华为昇腾(Ascend)后端的逐元素操作(Per-element Operations),这些操作通常用于图像处理和计算机视觉任务,通过 Ascend NPU 提供加速。这类操作包括但不限于加法、减法、乘法等基本算术运算,以及更复杂的颜色空间转换、阈值处理等。
具体的函数和实现细节可能会根据 OpenCV 版本以及 Ascend SDK 的集成有所不同,但以下是一些常见的逐元素操作及其 C++ 示例代码。
请注意,因为 cv::cann 命名空间下的函数不是标准 OpenCV 库的一部分,而是特定于支持 Ascend 加速的扩展模块,所以确保你使用的 OpenCV 版本已正确集成了对 Ascend 的支持,并且你的开发环境已经配置好相应的库和头文件。
主要函数
加法 (cv::cann::add)
函数原型
void cv::cann::add
(const InputArray src1,const InputArray src2,OutputArray dst,const InputArray mask = noArray(),int dtype = -1,AscendStream &stream = AscendStream::Null()
);
参数介绍
- src1: 第一个输入数组。
- src2: 第二个输入数组。
- dst: 输出数组,与输入大小和类型相同(除非指定了不同的dtype)。
- mask: 可选掩码,8位单通道数组,指定要更改的输出数组元素。
- dtype: 输出数组的数据类型,若为-1,则使用输入的深度。
- stream: Ascend流对象,用于异步执行。
示例代码
include <opencv2/opencv.hpp>
#include <opencv2/cann/cann.hpp>int main(){cv::Mat src1 = cv::Mat::ones(480, 640, CV_8UC3) * 50;cv::Mat src2 = cv::Mat::ones(480, 640, CV_8UC3) * 100;cv::Mat dst;cv::cann::AscendStream stream;cv::cann::add(src1, src2, dst, cv::noArray(), -1, stream);stream.waitForCompletion();cv::imshow("Add Result", dst);cv::waitKey(0);return 0;
}
减法 (cv::cann::subtract)
函数原型
void cv::cann::subtract
(const InputArray src1,const InputArray src2,OutputArray dst,const InputArray mask = noArray(),int dtype = -1,AscendStream &stream = AscendStream::Null()
);
参数介绍
同cv::cann::add。
示例代码
int main() {cv::Mat src1 = cv::Mat::ones(480, 640, CV_8UC3) * 100;cv::Mat src2 = cv::Mat::ones(480, 640, CV_8UC3) * 50;cv::Mat dst;cv::cann::AscendStream stream;cv::cann::subtract(src1, src2, dst, cv::noArray(), -1, stream);stream.waitForCompletion();cv::imshow("Subtract Result", dst);cv::waitKey(0);return 0;
}
乘法 (cv::cann::multiply)
函数原型
v
oid cv::cann::multiply
(const InputArray src1,const InputArray src2,OutputArray dst,double scale = 1,int dtype = -1,AscendStream &stream = AscendStream::Null()
);
参数介绍
- scale: 缩放因子,默认值为1。
- 其他参数同上。
示例代码
int main() {cv::Mat src1 = cv::Mat::ones(480, 640, CV_8UC3) * 50;cv::Mat src2 = cv::Mat::ones(480, 640, CV_8UC3) * 2;cv::Mat dst;cv::cann::AscendStream stream;cv::cann::multiply(src1, src2, dst, 1.0, -1, stream);stream.waitForCompletion();cv::imshow("Multiply Result", dst);cv::waitKey(0);return 0;
}
除法 (cv::cann::divide)
函数原型
void cv::cann::divide
(const InputArray src1,const InputArray src2,OutputArray dst,double scale = 1,int dtype = -1,AscendStream &stream = AscendStream::Null()
);
参数介绍
- scale: 缩放因子,默认值为1。
- 其他参数同上。
示例代码
int main() {cv::Mat src1 = cv::Mat::ones(480, 640, CV_8UC3) * 100;cv::Mat src2 = cv::Mat::ones(480, 640, CV_8UC3) * 2;cv::Mat dst;cv::cann::AscendStream stream;cv::cann::divide(src1, src2, dst, 1.0, -1, stream);stream.waitForCompletion();cv::imshow("Divide Result", dst);cv::waitKey(0);return 0;
}
按位与 (cv::cann::bitwise_and)
函数原型
void cv::cann::bitwise_and
(const InputArray src1,const InputArray src2,OutputArray dst,const InputArray mask = noArray(),AscendStream &stream = AscendStream::Null()
);
参数介绍
- src1: 第一个输入数组或标量。
- src2: 第二个输入数组或标量。
- dst: 输出数组,与输入大小和类型相同。
- mask: 可选掩码,8位单通道数组,指定要更改的输出数组元素。
- stream: Ascend流对象,用于异步执行。
示例代码
int main() {cv::Mat src1 = (cv::Mat_<uchar>(3, 3) << 0xFF, 0x0F, 0xF0,0xAA, 0x55, 0x00,0xFF, 0xFF, 0x00);cv::Mat src2 = (cv::Mat_<uchar>(3, 3) << 0x0F, 0x0F, 0x0F,0x0F, 0x0F, 0x0F,0x0F, 0x0F, 0x0F);cv::Mat dst;cv::cann::AscendStream stream;cv::cann::bitwise_and(src1, src2, dst, cv::noArray(), stream);stream.waitForCompletion();std::cout << "Result of bitwise_and:\n" << dst << std::endl;return 0;
}
按位非 (cv::cann::bitwise_not)
函数原型
void cv::cann::bitwise_not
(const InputArray src,OutputArray dst,const InputArray mask = noArray(),AscendStream &stream = AscendStream::Null()
);
参数介绍
- src: 输入数组或标量。
- dst: 输出数组,与输入大小和类型相同。
- mask: 可选掩码,8位单通道数组,指定要更改的输出数组元素。
- stream: Ascend流对象,用于异步执行。
示例代码
int main() {cv::Mat src = (cv::Mat_<uchar>(2, 2) << 0x00, 0xFF,0xAA, 0x55);cv::Mat dst;cv::cann::AscendStream stream;cv::cann::bitwise_not(src, dst, cv::noArray(), stream);stream.waitForCompletion();std::cout << "Result of bitwise_not:\n" << dst << std::endl;return 0;
}
按位或 (cv::cann::bitwise_or)
函数原型
void cv::cann::bitwise_or
(const InputArray src1,const InputArray src2,OutputArray dst,const InputArray mask = noArray(),AscendStream &stream = AscendStream::Null()
);
参数介绍
- 同cv::cann::bitwise_and。
示例代码
类似于cv::cann::bitwise_and,只需将bitwise_and替换为bitwise_or。
按位异或 (cv::cann::bitwise_xor)
函数原型
void cv::cann::bitwise_xor
(const InputArray src1,const InputArray src2,OutputArray dst,const InputArray mask = noArray(),AscendStream &stream = AscendStream::Null()
);
参数介绍
同cv::cann::bitwise_and。
示例代码
类似于cv::cann::bitwise_and,只需将bitwise_and替换为bitwise_xor。
阈值处理 (cv::cann::threshold)
函数原型
double cv::cann::threshold
(const InputArray src,OutputArray dst,double thresh,double maxval,int type,AscendStream &stream = AscendStream::Null()
);
参数介绍
- thresh: 阈值。
- maxval: 最大值,用于某些类型的阈值处理。
- type: 阈值处理类型(如THRESH_BINARY, THRESH_TOZERO等)。
- stream: Ascend流对象,用于异步执行。
示例代码
int main() {cv::Mat src = (cv::Mat_<uchar>(3, 3) << 50, 100, 150,200, 20, 30,80, 90, 100);cv::Mat dst;cv::cann::AscendStream stream;double thresholdValue = 100;double maxValue = 255;int thresholdType = cv::THRESH_BINARY;double otsuThreshold = cv::cann::threshold(src, dst, thresholdValue, maxValue, thresholdType, stream);stream.waitForCompletion();std::cout << "Otsu Threshold Value: " << otsuThreshold << std::endl;std::cout << "Threshold Result:\n" << dst << std::endl;return 0;
}
相关文章:
OpenCV中适用华为昇腾(Ascend)后端的逐元素操作(Per-element Operations)
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 针对华为昇腾(Ascend)后端的逐元素操作(Per-element Operations),这些操作通常用于图…...
Jenkins集成Maven
一、概述 Jenkins是一个开源的持续集成工具,用于自动化各种开发任务。Maven是一个项目管理和构建自动化工具,主要用于Java项目。通过将Jenkins和Maven集成,可以实现自动化构建、测试和部署,提高开发效率和代码质量。 二、前提条…...

初识Linux · TCP基本使用 · 回显服务器
目录 前言: 回显服务器 TCPserver_v0 TCPserver_v1--多进程版本 TCPserver_v2--多线程版本 前言: 前文我们介绍了UDP的基本使用,本文我们介绍TCP的基本使用,不过TCP的使用我们这里先做一个预热,即只是使用TCP的A…...
Qwen:Qwen3,R1 在 Text2SQL 效果评估
【对比模型】 Qwen3 235B-A22B(2350亿总参数,220亿激活参数),32B,30B-A3B;QwQ 32B(推理模型)DeepSeek-R1 671B(满血版)(推理模型) 1&a…...

【layout组件 与 路由镶嵌】vue3 后台管理系统
前言 很多同学在第一次搭建后台管理系统时,会遇到一个问题,layout组件该放哪里?如何使用?路由又该如何设计? 这边会讲一下我的思考过程和最后的结果,大家可以参考一下,希望大家看完能有所收获。…...

mobile自动化测试-appium webdriverio
WebdriverIO是一款支持mobile app和mobile web自动化测试框架,与appium集成,完成对mobile应用测试。支持ios 和android两种平台,且功能丰富,是mobile app自动化测试首选框架。且官方还提供了mobile 应用测试example代码࿰…...

Spring Bean有哪几种配置方式?
大家好,我是锋哥。今天分享关于【Spring Bean有哪几种配置方式?】面试题。希望对大家有帮助; Spring Bean有哪几种配置方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Bean的配置方式主要有三种ÿ…...

解析小米大模型MiMo:解锁语言模型推理潜力
一、基本介绍 1.1 项目背景 在大型语言模型快速发展的背景下,小米AI团队推出MiMo系列模型,突破性地在7B参数规模上实现卓越推理能力。传统观点认为32B以上模型才能胜任复杂推理任务,而MiMo通过创新的训练范式证明:精心设计的预训练和强化学习策略,可使小模型迸发巨大推理…...

证券行业数字化转型:灵雀云架设云原生“数字高速路”
01 传统架构难承重负,云原生破局成必然 截至2024年,证券行业总资产突破35万亿元,线上交易占比达85%,高频交易、智能投顾等业务对算力与响应速度提出极限要求。然而,以虚拟化为主导的传统IT架构面临四大核心瓶颈&#…...

Centos系统详解架构详解
CentOS 全面详解 一、CentOS 概述 CentOS(Community Enterprise Operating System) 是基于 Red Hat Enterprise Linux(RHEL) 源代码构建的免费开源操作系统,专注于稳定性、安全性和长期支持,广泛应用于服…...

【后端】SpringBoot用CORS解决无法跨域访问的问题
SpringBoot用CORS解决无法跨域访问的问题 一、跨域问题 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。但这个保护机制也带来了新的…...

MySQL 8.0(主从复制)
MySQL 8.0 的 主从复制(Master-Slave Replication) 是一种数据库高可用和数据备份的核心技术,下面用 一、什么是主从复制? 就像公司的「领导-秘书」分工: 主库(Master):负责处理所…...

TCPIP详解 卷1协议 十 用户数据报协议和IP分片
10.1——用户数据报协议和 IP 分片 UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。它提供差错检测,包含我们在传输层中碰到的第一个真实的端到端(end-to-end)校验和。这…...

finebi使用资源迁移无法导入资源,解决方法
finebi使用资源迁移无法导入资源,解决方法 最近在使用finebi开发finebi报表,报表开发之后,从一台电脑将资源导入另一台电脑后,出现不允许导入的提示,如下: 原因: 两个finebi的管理员名称不一致…...
【ASR学习笔记】:语音识别领域基本术语
一、基础术语 ASR (Automatic Speech Recognition) 自动语音识别,把语音信号转换成文本的技术。 VAD (Voice Activity Detection) 语音活动检测,判断一段音频里哪里是说话,哪里是静音或噪音。 Acoustic Model(声学模型࿰…...
精益数据分析(53/126):双边市场模式指标全解析与运营策略深度探讨
精益数据分析(53/126):双边市场模式指标全解析与运营策略深度探讨 在创业与数据分析的探索之路上,深入了解各类商业模式的关键指标和运营策略至关重要。今天,我们依然怀揣着与大家共同进步的信念,深入研读…...

分布式锁redisson的中断操作
1、先贴代码 RequestMapping(value "/update", method RequestMethod.POST)ResponseBodypublic Result update(RequestBody Employee employee) { // 修改数据库(存在线程不安全 需要使用redison设置分布式锁 防止被修改) // 设…...
【技巧】使用frpc点对点安全地内网穿透访问ollama服务
回到目录 【技巧】使用frpc点对点安全地内网穿透访问ollama服务 0. 为什么需要部署内网穿透点对点服务 在家里想访问单位强劲机器,但是单位机器只能单向访问互联网,互联网无法直接访问到这台机器。通过在云服务器、单位内网服务器、源端访问机器上&am…...
Django缓存框架API
这里写自定义目录标题 访问缓存django.core.cache.cachesdjango.core.cache.cache 基本用法cache.set(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get(key, defaultNone, versionNone)cache.add(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get_or_se…...
克隆虚拟机组成集群
一、克隆虚拟机 1. 准备基础虚拟机 确保基础虚拟机已安装好操作系统(如 Ubuntu)、Java 和 Hadoop。关闭防火墙并禁用 SELinux(如适用): bash sudo ufw disable # Ubuntu sudo systemctl disable firewalld # CentO…...

Docker:安装配置教程(最新版本)
文章目录 一、前言二、具体操作2.1 卸载 Docker (可选)2.2 重新安装(使用清华大学镜像)2.3 配置轩辕镜像加速2.4 Docker 基本命名2.5 测试是否成功 三、结语 一、前言 Docker 是一种容器化技术,在软件开发和部署中得到广泛的应用,…...
R语言实战第5章(1)
第一部分:数学、统计和字符处理函数 数学和统计函数:R提供了丰富的数学和统计函数,用于执行各种计算和分析。这些函数可以帮助用户快速完成复杂的数学运算、统计分析等任务,例如计算均值、方差、相关系数、进行假设检验等。字符处…...
Redis设计与实现——单机Redis实现
RedisDB RedisDB的核心结构 键空间(dict*dict) 结构:哈希表(字典),键为字符串对象(SDS),值为 Redis 对象(字符串、列表、哈希等)。 功能&#x…...

neo4j官方示例
目录 一、准备数据 1.执行查看结果 二、操作 1.find 单个节点 2.同上,已某个属性去查询 3. 指定查询个数 4.条件查询 5.查询某个人出演的电影汇总 6.查询tom出演的电影中,还有其他演员的信息。 7.查询跟电影(Cloud Atlas)有关的演员࿰…...
探讨关于智能体(Agent)结合 Dify、大语言模型(LLM)以及 Qwen-3 模型的项目或概念
1. Dify 的作用 Dify 是一个开源的 AI 框架,它可以帮助开发者快速搭建和部署 AI 应用。它可以作为一个基础架构,为智能体提供以下支持: 应用开发与部署:Dify 可以帮助开发者快速搭建智能体的前端和后端架构,包括用户界…...

前端自学入门:HTML 基础详解与学习路线指引
在互联网的浪潮中,前端开发如同构建数字世界的基石,而 HTML 则是前端开发的 “入场券”。对于许多渴望踏入前端领域的初学者而言,HTML 入门是首要挑战。本指南将以清晰易懂的方式,带大家深入了解 HTML 基础,并梳理前端…...
C++.Windows图形
Windows图形 1. 基础知识1.1 Windows图形编程基础1.2 GDI与GDI+1.3 窗口消息处理2.1 注册窗口类2.2 创建窗口2.3 显示窗口3.1 创建按钮3.2 按钮消息处理4.1 设置窗口透明度4.2 透明窗口示例5.1 使用区域创建异形窗口5.2 异形窗口示例6.1 GDI+抗锯齿设置6.2 抗锯齿绘图示例7.1 D…...

vue实现与后台springboot传递数据【传值/取值 Axios 】
vue实现与后台springboot传递数据【传值/取值】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每…...

【英语笔记(三)】介绍谓语动词的分类,初步讲解四种基本状态:一般、进行、完成、完成进行
1. 五大类谓语动词 2. 谓语动词分类 3. 动词时间 过去--------------------------现在-----------------------未来 3. 动词状态 3.1 进行状态 3.2 完成状态 3.3 完成进行状态 3.4 一般状态 4. 时间 状态 名称说明例句现在现在现在现在进行时态现在某物正在做什么事情一只…...

【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!
我在使用selenium的find_element的方式去获取网页元素,一般通过xpath、css_selector、class_name的方式去获取元素的绝对位置。 但是有时候如果网页多了一些弹窗或者啥之类的,绝对位置会发生变化,使用xpath等方法,需要经常变动。…...