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;
}

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

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

相关文章

Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)

Web前端—VSCode如何解决打开html页面中文乱码的问题&#xff08;方法2&#xff09; 1.打开VScode后&#xff0c;依次点击 文件 >> 首选项 >> 设置 2.打开设置后&#xff0c;依次点击 文本编辑器 >> 文件&#xff08;或在搜索框直接搜索“files.autoGuessEnc…

【UltralyticsYolo11图像分类完整项目-04】代码重构

经过上一篇博客,我们实现 了一个cpp文件,可以预测单个图像和多个图像。为了更加简化代码,方便部署,我们需要对代码进行重构:将功能模块化到头文件中。 完整代码下载链接:点击这里 重构的优点 模块化设计:将不同功能分离到不同的类中,每个类有明确的职责更好的可维护性:…

Debezium RelationalSnapshotChangeEventSource详解

Debezium RelationalSnapshotChangeEventSource详解 1. 类的作用与功能 1.1 核心功能 RelationalSnapshotChangeEventSource是Debezium中用于关系型数据库快照的核心抽象类,主要负责: 数据快照:对数据库表进行全量数据快照模式捕获:捕获数据库表结构事务管理:确保快照过…

DeepInjectSQL - 基于 AI 生成对抗网络(GAN)的下一代 SQL 注入自动化漏洞猎手

概述 SQLMap本身是一个成熟的自动化SQL注入工具&#xff0c;可以与GAN结合起来&#xff0c;让GAN生成的Payload替代传统的手工或规则生成的测试用例&#xff0c;从而提高检测的覆盖率和效率。 分析可行性 GAN通常用于生成类似真实数据分布的数据&#xff0c;例如图片、文本等。…

Python 爬虫之 XPath 元素定位

XPath 简介 XPath (XML Path Language) 最初是为了在 XML 文档中进行导航而设计的语言&#xff0c;后来被广泛应用于 HTML 文档的解析。与 BeautifulSoup 相比&#xff0c;XPath 有以下特点&#xff1a; 语法强大&#xff1a;可以通过简洁的表达式精确定位元素跨平台性&#…

聊聊自动化办公未来趋势

1. 自动化办公未来趋势 1.1 智能化与AI融合加深 随着人工智能技术的不断成熟&#xff0c;其在自动化办公中的应用将更加广泛和深入。未来&#xff0c;办公软件将具备更强的智能交互能力&#xff0c;能够理解自然语言指令&#xff0c;自动完成复杂的任务&#xff0c;如文档编辑…

智慧工会服务平台建设方案Word(23页)

1. 引言 随着信息技术的快速发展&#xff0c;传统工会服务模式面临挑战&#xff0c;智慧工会服务平台应运而生。该平台旨在通过数字化手段&#xff0c;整合工会资源&#xff0c;优化服务流程&#xff0c;提高工作效率&#xff0c;为会员提供更加便捷、高效、个性化的服务体验。…

React Hooks 深入浅出

目录 引言&#xff1a;React Hooks 的革命基础 Hooks useState&#xff1a;状态管理的新方式useEffect&#xff1a;组件生命周期的替代方案useContext&#xff1a;简化 Context API 额外的 Hooks useReducer&#xff1a;复杂状态逻辑的管理useCallback 与 useMemo&#xff1a;…

【应急响应】- 日志流量如何分析?

【应急响应】- 日志流量如何下手&#xff1f;https://mp.weixin.qq.com/s/dKl8ZLZ0wjuqUezKo4eUSQ

stm32 debug卡在0x1FFFxxxx

自己画的一个四轴飞机电路板&#xff0c;之前还能debug&#xff0c;改了一下mos管两端的电阻&#xff0c;还能正常下载&#xff0c;蓝牙接收也正常&#xff0c;但是debug出问题了&#xff0c;刚下载就自动运行&#xff0c;然后程序就在0x1FFFxxxx附近循环运行&#xff0c;这一块…

java-----------------多态

多态&#xff0c;当前指的是 java 所呈现出来的一个对象 多态 定义 多态是指同一个行为具有多个不同表现形式或形态的能力。在面向对象编程中&#xff0c;多态通过方法重载和方法重写来实现。 强弱类型语言 javascript 或者python 是弱类型语言 C 语言&#xff0c;或者 C…

Java 23种设计模式 - 结构型模式7种

Java 23种设计模式 - 结构型模式7种 1 适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 优点 将目标类和适配者类解耦增加了类的透明性和复用性&#xff0c;将具体的实现封…

Git clone时出现SSL certificate problem unable to get local issuer certificate

正确解决方法 git config --global http.sslVerify false错误解决方法&#xff1a;&#xff08;主要是看错了嘿嘿&#xff0c;但是如果是 OpenSSL SSL_read: Connection was reset, errno 10054 Failed to connect to github.com port 443: Timed out 原…

DevExpressWinForms-AlertControl-使用教程

文章目录 AlertControl-使用教程一、将 AlertControl 添加到 Form二、编辑 AlertControl 的 HtmlTemplateHTML Template Editor介绍编辑HTML Template 三、使用AlertControl弹出AlertAlert中的按钮事件获取 Alert 标题等信息向Alert传递参数 总结源码 AlertControl-使用教程 一…

制作项目进度表常用的 8 款项目管理工具分享

在数字化管理和高效协作的今天&#xff0c;项目进度表软件已经成为企业管理不可或缺的工具。无论是中小型企业还是大型机构&#xff0c;都需要通过精准的项目计划和实时的进度跟踪来确保业务目标的顺利达成。这篇文章将聚焦项目进度表软件&#xff0c;深入探讨市场上8款主流产品…

SecureCRT网络穿透/代理

场景 公司的办公VPN软件只有Windows系统版本&#xff0c;没有Macos系统版本&#xff0c;而日常开发过程中需要先登录VPN后&#xff0c;然后才能登录应用服务器。 目的&#xff1a;Macos系统在使用SecureCRT时&#xff0c;登录服务器&#xff0c;需要走Parallels Desktop进行网络…

【计算机网络-传输层】传输层协议-TCP核心机制与可靠性保障

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;传输层协议-UDP 下篇文章&#xff1a; 网络层 我们的讲解顺序是&…

OpenMagnetic的介绍与使用

1. Background OM&#xff08;OpenMagnetic&#xff09;OpenMagnetics&#xff0c;能涵盖气隙磁阻&#xff0c;磁导率&#xff0c;铁芯损耗、磁滞损耗、涡流电流损耗、涡流效应、漏感、温升的计算与仿真[1]。 铁损计算模型&#xff1a;改进的Steinmetz方程[2] 气隙阻抗计算&…

【JVM】从零开始深度解析JVM

本篇博客给大家带来的是JVM的知识点, 重点在类加载和垃圾回收机制上. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; …

字符串---Spring字符串基本处理

一、String类的特性 不可变性 String对象一旦创建&#xff0c;内容不可更改&#xff0c;任何修改操作都会生成新对象。字符串常量池 字符串字面量&#xff08;如"abc"&#xff09;直接存储在常量池中&#xff0c;重复字面量共享同一内存地址。创建方式 虽然都是字符…