- 操作系统: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