- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
該函數用于計算兩個無符號字符向量(uchar1)的歐幾里得距離(即直角三角形的斜邊長度),公式為 d = a 2 + b 2 d = \sqrt{a^2 + b^2} % d=a2+b2?
?,結果以單精度浮點向量(float1)返回。
主要應用于圖像處理中的像素距離計算、特征匹配等場景,通過GPU并行加速提升性能.
函數原型?
__device__ __forceinline__ float1 cv::cudev::hypot ( const uchar1 & a,const uchar1 & b )
參數
參數 | 類型 | 描述 |
---|---|---|
a | const uchar1& | 輸入的無符號字符向量(單通道,值域0-255)。 |
b | const uchar1& | 輸入的無符號字符向量(單通道,值域0-255)。 |
?注意?:輸入值超出0-255范圍可能導致浮點溢出。
返回值?
- ?類型?:float1
- 返回單精度浮點向量,值為 a 2 + b 2 \sqrt{a^2 + b^2} a2+b2? ? 的計算結果。
代碼示例
#include <opencv2/opencv.hpp>
#include <opencv2/cudev/common.hpp>
#include <opencv2/cudev/util/vec_math.hpp>__global__ void kernel_hypot(const cv::cudev::PtrStepSz<uchar1> src1, const cv::cudev::PtrStepSz<uchar1> src2,cv::cudev::PtrStepSz<float1> dst) {int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < src1.cols && y < src1.rows) {dst(y, x) = cv::cudev::hypot(src1(y, x), src2(y, x));}
}int main() {// 1. 準備測試數據cv::Mat h_src1(512, 512, CV_8UC1);cv::Mat h_src2(512, 512, CV_8UC1);cv::randu(h_src1, 0, 255);cv::randu(h_src2, 0, 255);// 2. 上傳數據到GPUcv::cuda::GpuMat d_src1, d_src2, d_dst;d_src1.upload(h_src1);d_src2.upload(h_src2);d_dst.create(h_src1.size(), CV_32FC1);// 3. 調用核函數dim3 block(16, 16);dim3 grid((h_src1.cols + block.x - 1) / block.x, (h_src1.rows + block.y - 1) / block.y);kernel_hypot<<<grid, block>>>(cv::cudev::PtrStepSz<uchar1>(d_src1),cv::cudev::PtrStepSz<uchar1>(d_src2),cv::cudev::PtrStepSz<float1>(d_dst));// 4. 驗證結果cv::Mat h_dst;d_dst.download(h_dst);std::cout << "Sample result: " << h_dst.at<float>(0,0) << std::endl;return 0;
}
運行結果
Sample result: 199.023