OpenCV中适用华为昇腾(Ascend)后端的逐元素操作(Per-element Operations)

news2025/5/13 21:26:13
  • 操作系统: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.coloradmin.cn/o/2374931.html

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

相关文章

初识Linux · TCP基本使用 · 回显服务器

目录 前言&#xff1a; 回显服务器 TCPserver_v0 TCPserver_v1--多进程版本 TCPserver_v2--多线程版本 前言&#xff1a; 前文我们介绍了UDP的基本使用&#xff0c;本文我们介绍TCP的基本使用&#xff0c;不过TCP的使用我们这里先做一个预热&#xff0c;即只是使用TCP的A…

【layout组件 与 路由镶嵌】vue3 后台管理系统

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

mobile自动化测试-appium webdriverio

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

Spring Bean有哪几种配置方式?

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

解析小米大模型MiMo:解锁语言模型推理潜力

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

证券行业数字化转型:灵雀云架设云原生“数字高速路”

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

Centos系统详解架构详解

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

【后端】SpringBoot用CORS解决无法跨域访问的问题

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

MySQL 8.0(主从复制)

MySQL 8.0 的 主从复制&#xff08;Master-Slave Replication&#xff09; 是一种数据库高可用和数据备份的核心技术&#xff0c;下面用 一、什么是主从复制&#xff1f; 就像公司的「领导-秘书」分工&#xff1a; 主库&#xff08;Master&#xff09;&#xff1a;负责处理所…

TCPIP详解 卷1协议 十 用户数据报协议和IP分片

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

finebi使用资源迁移无法导入资源,解决方法

finebi使用资源迁移无法导入资源&#xff0c;解决方法 最近在使用finebi开发finebi报表&#xff0c;报表开发之后&#xff0c;从一台电脑将资源导入另一台电脑后&#xff0c;出现不允许导入的提示&#xff0c;如下&#xff1a; 原因&#xff1a; 两个finebi的管理员名称不一致…

分布式锁redisson的中断操作

1、先贴代码 RequestMapping(value "/update", method RequestMethod.POST)ResponseBodypublic Result update(RequestBody Employee employee) { // 修改数据库&#xff08;存在线程不安全 需要使用redison设置分布式锁 防止被修改&#xff09; // 设…

Docker:安装配置教程(最新版本)

文章目录 一、前言二、具体操作2.1 卸载 Docker (可选)2.2 重新安装&#xff08;使用清华大学镜像&#xff09;2.3 配置轩辕镜像加速2.4 Docker 基本命名2.5 测试是否成功 三、结语 一、前言 Docker 是一种容器化技术&#xff0c;在软件开发和部署中得到广泛的应用&#xff0c…

neo4j官方示例

目录 一、准备数据 1.执行查看结果 二、操作 1.find 单个节点 2.同上&#xff0c;已某个属性去查询 3. 指定查询个数 4.条件查询 5.查询某个人出演的电影汇总 6.查询tom出演的电影中&#xff0c;还有其他演员的信息。 7.查询跟电影(Cloud Atlas)有关的演员&#xff0…

前端自学入门:HTML 基础详解与学习路线指引

在互联网的浪潮中&#xff0c;前端开发如同构建数字世界的基石&#xff0c;而 HTML 则是前端开发的 “入场券”。对于许多渴望踏入前端领域的初学者而言&#xff0c;HTML 入门是首要挑战。本指南将以清晰易懂的方式&#xff0c;带大家深入了解 HTML 基础&#xff0c;并梳理前端…

vue实现与后台springboot传递数据【传值/取值 Axios 】

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

【英语笔记(三)】介绍谓语动词的分类,初步讲解四种基本状态:一般、进行、完成、完成进行

1. 五大类谓语动词 2. 谓语动词分类 3. 动词时间 过去--------------------------现在-----------------------未来 3. 动词状态 3.1 进行状态 3.2 完成状态 3.3 完成进行状态 3.4 一般状态 4. 时间 状态 名称说明例句现在现在现在现在进行时态现在某物正在做什么事情一只…

【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!

我在使用selenium的find_element的方式去获取网页元素&#xff0c;一般通过xpath、css_selector、class_name的方式去获取元素的绝对位置。 但是有时候如果网页多了一些弹窗或者啥之类的&#xff0c;绝对位置会发生变化&#xff0c;使用xpath等方法&#xff0c;需要经常变动。…

2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用

一、创建请求封装目录 选中自己的项目&#xff0c;右键鼠标---->新建---->目录---->名字自定义【我的是api】 二、创建两个js封装文件 选中封装的目录&#xff0c;右键鼠标---->新建---->js文件---->名字自定义【我的两个js文件分别是my_http和my_api】 三…

Ascend的aclgraph(二)_npu_backend中还有些什么秘密?

1 _npu_backend 文章还是从代码开始 import torch_npu, torchair config torchair.CompilerConfig() # 设置图下沉执行模式 config.mode "reduce-overhead" npu_backend torchair.get_npu_backend(compiler_configconfig) opt_model torch.compile(model, back…