3
我遇到了OpenCV GaussianBlur函数和EmguCv CvInvoke.cvSmooth/Image.SmoothGaussian函数之间的不匹配。为什么EmguCV高斯模糊不能返回与OpenCV高斯模糊相同的结果?
的高斯模糊呼叫:
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并执行二进制diff)。
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图像稍微模糊。有任何想法吗?我也转置了this question on the EmguCV forum。
您链接项目的库是否完全一样?也许其中一个被编译为使用GPU或流指令,另一个完全在CPU FP ALU中执行,因此可能存在舍入错误,在更快(更不准确)的实现中更明显 – fortran
@fortran从我能用Process Explorer告诉,这两个应用程序都加载了相同的3个OpenCV DLL和1个TBB DLL。 –