简单的水漫填充算法的各参数效果展示,用滑动条键盘控制

在这里插入图片描述

#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);

}

甚至各种模式都可以用滑动条控制,这样更加直观。

发布了138 篇原创文章 · 获赞 5 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章