#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);
}
甚至各種模式都可以用滑動條控制,這樣更加直觀。