0
我在OpenCV中創建了以下高斯內核,並將其與OpenCV的GaussianBlur函數進行比較。但是,我得到一個黑色的圖像,而不是一個光滑的圖像。有人可以對此有所瞭解嗎?使用opencv進行高斯平滑
Mat src, dst1,dst2;
Mat gaussiankrnl(3,3,CV_32F);
Point anchor;
double delta;
int ddepth;
anchor = Point(-1, -1);
delta = 0;
ddepth = -1;
src = imread("coins.pgm");
gaussiankrnl.at<double>(0,0) = 1/16;
gaussiankrnl.at<double>(0,1) = 2/16;
gaussiankrnl.at<double>(0,2) = 1/16;
gaussiankrnl.at<double>(1,0) = 2/16;
gaussiankrnl.at<double>(1,1) = 4/16;
gaussiankrnl.at<double>(1,2) = 2/16;
gaussiankrnl.at<double>(2,0) = 1/16;
gaussiankrnl.at<double>(2,1) = 2/16;
gaussiankrnl.at<double>(2,2) = 1/16;
filter2D(src, dst1, ddepth , gaussiankrnl, anchor, delta, BORDER_DEFAULT);
GaussianBlur(src, dst2, Size(3,3), 1.0);
imshow("result1", dst1);
imshow("result2", dst2);
cvWaitKey(0);
return 0;
嗨,謝謝。你能告訴我爲什麼結果有差異嗎?他們不應該是一樣的嗎??我在此發佈了結果:http://i47.tinypic.com/2qn7br6.png –
更改爲1.0/16.0有所幫助。另外我使用CV_32F,這是錯誤的。相反,必須使用CV_64F。 –
如果您在C++中編寫1/16,則會得到整數除法,結果爲1/16 = 0,然後將其轉換爲double。您必須將這些數字中的至少一個加倍。您可以通過投射或在其中一個數字的末尾附加.0(或僅)。 1./16也會起作用。 –