当前位置: 首页 > news >正文

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

相关文章:

  • 【质量管理】TRIZ因果链分析:解码质量问题的“多米诺效应“
  • 经典计算核心问题在于多项式时间内无法求解
  • 重庆工商职业学院“户卫者”团队为建筑外墙检测技术推广创新赋能
  • PostgreSQL创建只读账号
  • 自适应混合索引创建与管理:一种智能数据库优化机制的研究
  • PH热榜 | 2025-05-09
  • 『Python学习笔记』ubuntu解决matplotlit中文乱码的问题!
  • 鸿蒙电脑:五年铸剑开新篇,国产操作系统新引擎
  • 华为防火墙双机热备(负载分担)
  • 华为欧拉(EulerOS)系统全栈软件部署指南:从 Redis 到 MySQL 实战详解
  • 计算机视觉】OpenCV项目实战:eye_mouse_movement:基于opencv实战眼睛控制鼠标
  • Oracle — 数据管理
  • Faiss 索引深度解析:从基础到实战
  • 文旅田园康养小镇规划设计方案PPT(85页)
  • RabbitMQ-高级特性1
  • 如何避免双击时触发单击事件
  • Springboot+Vue+Mybatis-plus-Maven-Mysql项目部署
  • Kepware价格大概是多少?在哪里可以下载正版试用?
  • 李沐《动手学深度学习》 | 多层感知机
  • WebRTC工作原理详细介绍、WebRTC信令交互过程和WebRTC流媒体传输协议介绍
  • 国家发改委:大部分稳就业稳经济政策将在6月底前落地
  • 招商基金总经理徐勇因任期届满离任,“老将”钟文岳回归接棒
  • 不赚“快钱”的佳沛:蒋时杰解密新西兰国果如何在中国“慢养”出43亿生意
  • 国家统计局:4月份各线城市商品住宅销售价格环比持平或略降
  • 自媒体假扮官方蹭反间谍热度攫取利益,国安机关提醒
  • 北斗系统全面进入11个国际组织的标准体系