示例程序中可以用滑动条来控制三种线性滤波的核参数值。通过滑动滚动条,就可以控制图像在三种线性滤波下的模糊度,有一定的可玩性。详细注释的代码如下:
#include
#include
#include"opencv2/highgui/highgui.hpp"
#include
#include
#include
#include
using namespace std;
using namespace cv;
Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3;
int g_nBoxFilterValue = 3;
int g_nMeanBlurValue = 3;
int g_nGaussianBlurValue = 3;
static void on_BoxFilter(int, void*);
static void on_MeanBlur(int, void*);
static void on_GaussianBlur(int, void*);
int main()
{
system("color5E");
cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
g_srcImage = imread("E:/pictures/12.png", 1);
g_dstImage1 = g_srcImage.clone();
g_dstImage2 = g_srcImage.clone();
g_dstImage3 = g_srcImage.clone();
namedWindow("[<0>原图窗口]", 1);
imshow("[<0>原图窗口]", g_srcImage);
//方框滤波
namedWindow("[<1>方框滤波]", 1);
createTrackbar("内核值:", "[<1>方框滤波]", &g_nBoxFilterValue, 40, on_BoxFilter);
on_MeanBlur(g_nBoxFilterValue, 0);
imshow("[<1>方框滤波]", g_dstImage1);
//均值滤波
namedWindow("[<2>均值滤波]", 1);
createTrackbar("内核值:", "[<2>均值滤波]", &g_nMeanBlurValue, 40, on_MeanBlur);
on_MeanBlur(g_nMeanBlurValue, 0);
//高斯滤波
namedWindow("[<3>高斯滤波]", 1);
createTrackbar("内核值:", "[<2>均值滤波]", &g_nGaussianBlurValue, 40, on_GaussianBlur);
on_GaussianBlur(g_nGaussianBlurValue, 0);
cout << endl << "\t,请调整滑动条看图\n\n" << "\t按下q键,程序退出\n";
while (char(waitKey(1)) != 'q')
{
}
return 0;
}
static void on_BoxFilter(int, void*)
{
boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));
imshow("[<1>方框滤波]", g_dstImage1);
}
static void on_MeanBlur(int, void*)
{
blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1), Point(-1, -1));
imshow("[<2>均值滤波]", g_dstImage2);
}
static void on_GaussianBlur(int, void*)
{
GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1), 0, 0);
imshow("[<3>高斯滤波]", g_dstImage3);
}