cv::resize 与cv::cuda::resize 如何保持结果一致
cv::resize(CPU版本) 和(GPU版本) 在默认情况下可能会产生微小的差异,主要原因包括:不同的实现算法浮点数计算的顺序差异硬件加速带来的精度差异// 输入图像// 下载结果// 比较结果std::cout << "最大差异: " << maxDiff << std::endl;
cv::resize
(CPU版本) 和 cv::cuda::resize
(GPU版本) 在默认情况下可能会产生微小的差异,主要原因包括:
-
不同的实现算法
-
浮点数计算的顺序差异
-
硬件加速带来的精度差异
-
// 输入图像
cv::Mat src_cpu = cv::imread("input.jpg", cv::IMREAD_COLOR);// CPU resize
cv::Mat dst_cpu;
cv::resize(src_cpu, dst_cpu, cv::Size(640, 480), 0, 0, cv::INTER_LINEAR);// GPU resize
cv::cuda::GpuMat src_gpu, dst_gpu;
src_gpu.upload(src_cpu);
cv::cuda::resize(src_gpu, dst_gpu, cv::Size(640, 480), 0, 0, cv::INTER_LINEAR);// 下载结果
cv::Mat dst_cpu_from_gpu;
dst_gpu.download(dst_cpu_from_gpu);// 比较结果
cv::Mat diff = cv::abs(dst_cpu - dst_cpu_from_gpu);
double maxDiff = cv::norm(diff, cv::NORM_INF);
std::cout << "最大差异: " << maxDiff << std::endl; -
典型差异原因及解决方案
差异原因 解决方案 浮点计算顺序不同 使用双精度计算 算法实现不同 使用相同的插值方法 边界处理不同 明确指定边界模式 硬件加速差异 禁用特定优化
更多推荐
所有评论(0)