C++ 基于opencv的高斯平滑

C++ 基于opencv的高斯平滑,c++,opencv,gaussian,C++,Opencv,Gaussian,我在OpenCV中创建了以下高斯核,并将其与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"); gaussia

我在OpenCV中创建了以下高斯核,并将其与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;
matsrc、dst1、dst2;
Mat-gaussiankrnl(3,3,CV_32F);
点锚;
双三角洲;
int-ddepth;
锚点=点(-1,-1);
δ=0;
ddepth=-1;
src=imread(“coins.pgm”);
(0,0)处的高斯噪声=1/16;
(0,1)处的高斯噪声=2/16;
(0,2)处的gaussiankrnl=1/16;
(1,0)处的高斯噪声=2/16;
(1,1)处的高斯分布=4/16;
(1,2)=2/16时的gaussiankrnl;
(2,0)处的高斯噪声=1/16;
(2,1)处的高斯分布=2/16;
(2,2)处的高斯分布=1/16;
过滤器2D(src、dst1、ddepth、gaussiankrnl、anchor、delta、BORDER_默认值);
GaussianBlur(src,dst2,大小(3,3),1.0);
imshow(“结果1”,dst1);
imshow(“结果2”,dst2);
cvWaitKey(0);
返回0;

您正在对整数进行除法,并使内核为零


1/16
更改为
1.0/16.0
以及其他值。

您正在对整数进行除法,并使内核为零


1/16
更改为
1.0/16.0
以及其他值。

您好,谢谢。你能告诉我为什么结果不同吗?他们不应该是一样的吗。?我在这里发布了结果:更改为1.0/16.0有帮助。此外,我使用了CV_32F,这是错误的。相反,必须使用CVY64 FF。如果在C++中编写1/16,则得到整数除法,结果为1/16=0,然后将其转换为加倍。您必须将这些数字中的至少一个转换为双精度。您可以通过强制转换或在其中一个数字的末尾附加.0(或仅附加)。1./16也可以。嗨,谢谢。你能告诉我为什么结果不同吗?他们不应该是一样的吗。?我在这里发布了结果:更改为1.0/16.0有帮助。此外,我使用了CV_32F,这是错误的。相反,必须使用CVY64 FF。如果在C++中编写1/16,则得到整数除法,结果为1/16=0,然后将其转换为加倍。您必须将这些数字中的至少一个转换为双精度。您可以通过强制转换或在其中一个数字的末尾附加.0(或仅附加)。1/16也可以。