#include<iostream>
#include<opencv2/opencv.hpp>
#define window1 "【结果1】"
#define window "【原图 】"
#define window2 "【结果2】"
#define window3 "【结果3】"
#define window4 "【结果4】"
#define window5 "【结果5】"
using namespace std;
using namespace cv;
Mat src,dst;
int gn_low=20, gn_up=20;
int fillmod = 1;//控制是否为固定和浮动。
int num = 1;//控制4位或者8位。
int g_newmask = 255;
int g_niegbor = 4;
static void on_mouse(int event, int x, int y,int, void*); //注意参数个数。
//简单的水漫填充算法的各参数效果展示,用滑动条于数字键盘控制。
//int floodFill(src,seed,newvalue,rect,lowscalar,upscalar,flag(4,8|0-255占8-16位,floodfillde_fixed_range和floodfilled_mask_only))
int main()
{
//1.读取原图。
src = imread("滤波图.jpg",1);
resize(src,src,Size(),0.4,0.4);
//imshow("window",src);
//2.拷贝图像到结果图。
src.copyTo(dst);
//3.创建两个滑动条,控制lowscalar和upscalar.
namedWindow(window1);
createTrackbar("负最大值",window1,&gn_low,255,0);
createTrackbar("正最大值",window1,&gn_up,255,0);
//4.创建鼠标回调函数,控制seed点,这个点从鼠标所在取出。
setMouseCallback(window1,on_mouse,0);
//5.用while(1)函数来控制退出或者处理,以及按键的转换,循环体中用waitkey暂停,取按键。
//6.如果按键是esc==27,那么就退出,如果是1,那么模式进行固定和浮动变换。4位和8位。
while (1)
{
char c;
imshow(window1,dst);
c = waitKey(0);
if (c == 27)
{
cout << "程序退出!!";
break;
}
switch ((char)c)
{
case '1':
if (g_niegbor == 4)
{
g_niegbor = 8;
}
else
g_niegbor = 4;
break;
case '2':
if (fillmod == 1)
{
fillmod = 0;
}
else
fillmod = 1;
break;
}
}
return 0;
}
//4.on_mouse函数。
static void on_mouse(int event, int x, int y,int ,void*)//注意参数个数。
{
//1.判断鼠标动作
if (event != EVENT_LBUTTONDOWN)
return;
//2.准备参数
Point seed = Point(x,y);
int flag = g_niegbor + (g_newmask << 8) + (fillmod==1?FLOODFILL_FIXED_RANGE:0);
//3.准备随机颜色。随机函数生成器,theRNG();
int r = (unsigned)theRNG() & 255;
int g = (unsigned)theRNG() & 255;
int b = (unsigned)theRNG() & 255;
Scalar rgb = Scalar(b,g,r);
Rect rect;
//4.开始调用floodfilled函数。
floodFill(dst,seed,rgb,&rect,Scalar(gn_low,gn_low,gn_low),Scalar(gn_up, gn_up,gn_up),flag);
//5.显示结果。
imshow(window1,dst);
}
甚至各种模式都可以用滑动条控制,这样更加直观。