C# 为什么EmguCV高斯模糊不能返回与OpenCV高斯模糊相同的结果?

C# 为什么EmguCV高斯模糊不能返回与OpenCV高斯模糊相同的结果?,c#,c++,image-processing,opencv,emgucv,C#,C++,Image Processing,Opencv,Emgucv,我遇到OpenCV GaussianBlur函数和EmguCv CvInvoke.cvSmooth/Image.SmoothGaussian函数之间的不匹配 高斯模糊调用: GaussianBlur(src, dest, Size(13,13), 1.5, BORDER_REPLICATE); EmguCV调用: CvInvoke.cvSmooth(src, dst, SMOOTH_TYPE.CV_GAUSSIAN, 13, 13, 1.5, 0); 在这两种情况下,src都是32F、3通道

我遇到OpenCV GaussianBlur函数和EmguCv CvInvoke.cvSmooth/Image.SmoothGaussian函数之间的不匹配

高斯模糊调用:

GaussianBlur(src, dest, Size(13,13), 1.5, BORDER_REPLICATE);
EmguCV调用:

CvInvoke.cvSmooth(src, dst, SMOOTH_TYPE.CV_GAUSSIAN, 13, 13, 1.5, 0);
在这两种情况下,src都是32F、3通道映像。我已经验证了src的内容是相同的(将它们保存为bmp并进行了二进制区分)

opencv中的cvSmooth调用如下所示:

CV_IMPL void
cvSmooth( const void* srcarr, void* dstarr, int smooth_type,
          int param1, int param2, double param3, double param4 )
{
    cv::Mat src = cv::cvarrToMat(srcarr), dst0 = cv::cvarrToMat(dstarr), dst = dst0;

    if( smooth_type == CV_GAUSSIAN )
        cv::GaussianBlur( src, dst, cv::Size(param1, param2), param3, param4, cv::BORDER_REPLICATE );
}
…这似乎和我最初的OpenCV调用做的一样。在EmguCV和OpenCV中,CV_GAUSSIAN均定义为2。结果非常接近,但EmguCV图像比OpenCV图像更模糊。有什么想法吗?我还做了交叉张贴。

问题在于:

GaussianBlur(src, dest, Size(13,13), 1.5, BORDER_REPLICATE);
传递1.5作为sigma1,传递1(边界_复制)作为sigma2。将Emgu代码更改为

CvInvoke.cvSmooth(src, dst, SMOOTH_TYPE.CV_GAUSSIAN, 13, 13, 1.5, 1);

结果完全匹配。

您链接项目的库是否完全相同?可能其中一个编译为使用GPU或流式指令,而另一个完全在CPU FP ALU中执行,因此可能存在舍入错误,舍入错误越快(也越不准确)implementations@fortran从Process Explorer可以看出,这两个应用程序加载的是相同的3个OpenCV dll和1个TBB dll。