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。 –