- 操作系統: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;
}