OpenCV中CPU和GPU(CUDA)的不同结果

OpenCV中CPU和GPU(CUDA)的不同结果,opencv,image-processing,Opencv,Image Processing,我自己用VS2013构建OpenCV 3.0.0 我用相同的参数在同一个图像上应用了FastNLMeansDenoise(CPU版本和CUDA版本), 但是结果不同 发生什么事了 我猜原因是CPU和GPU的精度不同 #include <string> #include <opencv2/core/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui

我自己用VS2013构建OpenCV 3.0.0

我用相同的参数在同一个图像上应用了FastNLMeansDenoise(CPU版本和CUDA版本), 但是结果不同

发生什么事了

我猜原因是CPU和GPU的精度不同

   #include <string>
   #include <opencv2/core/core.hpp>
   #include <opencv2/imgcodecs.hpp>
   #include <opencv2/highgui/highgui.hpp>
   #include <opencv2/photo/cuda.hpp>
   #include <opencv2/photo.hpp>

   using namespace std;
   using namespace cv;

   int main(){

       string imageName("input.bmp");

       //CPU version
       Mat image = imread(imageName.c_str(), IMREAD_GRAYSCALE);
       Mat reslutCPU;
       fastNlMeansDenoising(image, reslutCPU, 2.5, 7, 31);
       imwrite("cpu.bmp", reslutCPU);

       //CUDA version       
       cuda::GpuMat imageGPU;
       cuda::GpuMat reslutGPU;
       Mat buff;
       imageGPU.upload(image);
       cuda::fastNlMeansDenoising(imageGPU, reslutGPU, 2.5, 7, 31);
       reslutGPU.download(buff);
       imwrite("gpu.bmp", buff);

       return 0;
   }
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main(){
字符串imageName(“input.bmp”);
//CPU版本
Mat image=imread(imageName.c_str(),imread_灰度);
Mat-reslutCPU;
FastNLmeans去噪(图像,reslutCPU,2.5,7,31);
imwrite(“cpu.bmp”,reslutcup);
//CUDA版本
cuda::GpuMat imageGPU;
cuda::GpuMat reslutGPU;
垫抛光;
上传图像;
cuda::FastNLmeans去噪(imageGPU,reslutGPU,2.5,7,31);
reslutGPU.download(buff);
imwrite(“gpu.bmp”,buff);
返回0;
}

您的代码看起来不错,应该提供相同的结果。差异的数量级是多少?是否超过1个灰度级?如果这大于1,则可能是opencv库中的问题,您可以在此处填写错误报告:谢谢!但是,我不知道你是什么意思,下面是我的结果:1.INPUT:2.CPU:3.GPU:我认为这是一个错误。你试过使用预建库吗?预建库没有CUDA。你的GPU和CPU计算之间有多达4个灰度级的差异,这对于舍入误差来说太大了。我们可以注意到,图像中所有白色区域的结果都是相同的。我没有看过opencv代码,但在GPU上使用“高斯模糊”这样的简单过滤器是否也有相同的区别?opencv编码器是否使用纹理应用过滤器,而忘记对像素到texel坐标使用+0.5?您的代码看起来不错,应该提供相同的结果。差异的数量级是多少?是否超过1个灰度级?如果这大于1,则可能是opencv库中的问题,您可以在此处填写错误报告:谢谢!但是,我不知道你是什么意思,下面是我的结果:1.INPUT:2.CPU:3.GPU:我认为这是一个错误。你试过使用预建库吗?预建库没有CUDA。你的GPU和CPU计算之间有多达4个灰度级的差异,这对于舍入误差来说太大了。我们可以注意到,图像中所有白色区域的结果都是相同的。我没有看过opencv代码,但在GPU上使用“高斯模糊”这样的简单过滤器是否也有相同的区别?opencv编码器是否使用纹理应用过滤器,而忘记在像素到texel坐标上使用+0.5?