针对华为昇腾(Ascend)后端的逐元素操作(Per-element Operations),这些操作通常用于图像处理和计算机视觉任务,通过 Ascend NPU 提供加速。这类操作包括但不限于加法、减法、乘法等基本算术运算,以及更复杂的颜色空间转换、阈值处理等。
具体的函数和实现细节可能会根据 OpenCV 版本以及 Ascend SDK 的集成有所不同,但以下是一些常见的逐元素操作及其 C++ 示例代码。
请注意,因为 cv::cann 命名空间下的函数不是标准 OpenCV 库的一部分,而是特定于支持 Ascend 加速的扩展模块,所以确保你使用的 OpenCV 版本已正确集成了对 Ascend 的支持,并且你的开发环境已经配置好相应的库和头文件。
void cv::cann::add
(
const InputArray src1,
const InputArray src2,
OutputArray dst,
const InputArray mask = noArray(),
int dtype = -1,
AscendStream &stream = AscendStream::Null()
);
include <opencv2/opencv.hpp>
#include
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;
}
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;
}
v
oid cv::cann::multiply
(
const InputArray src1,
const InputArray src2,
OutputArray dst,
double scale = 1,
int dtype = -1,
AscendStream &stream = AscendStream::Null()
);
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;
}
void cv::cann::divide
(
const InputArray src1,
const InputArray src2,
OutputArray dst,
double scale = 1,
int dtype = -1,
AscendStream &stream = AscendStream::Null()
);
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;
}
void cv::cann::bitwise_and
(
const InputArray src1,
const InputArray src2,
OutputArray dst,
const InputArray mask = noArray(),
AscendStream &stream = AscendStream::Null()
);
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;
}
void cv::cann::bitwise_not
(
const InputArray src,
OutputArray dst,
const InputArray mask = noArray(),
AscendStream &stream = AscendStream::Null()
);
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;
}
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,只需将bitwise_and替换为bitwise_or。
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。
double cv::cann::threshold
(
const InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type,
AscendStream &stream = AscendStream::Null()
);
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;
}