opencv中图形用户界面使用

==============图形用户界面入门内容===================

1. 图像的载入显示输出到文件的详细分析;

2. 滑动条(Trackbar)的创建和使用;

3. Opencv的鼠标操作

1. ====图像的载入、图像的显示、创建窗口、输出、存储图像============

图像的载入 Mat imread(const string& filename, int flags=1); 

//例子:读取D盘中opencv学习文件夹下的名为test_read的JPG格式图片,并存储到frame变量;

Mat frame = imread("D:\\opencv学习\\test_read.jpg", 1);   //注意:第二个参数直接给数值,不需要加“int flags =”

//flags = 0, 返回灰度图像;flags = 1, 返回彩色图(三通道); flags = 2, 返回任意深度的图像。

图像的显示 void imshow(const string& winname, InputArray mat);

//例子:在名为“show”的窗口中显示frame图像(frame是代表图像的变量)

imshow("show", frame);

创建窗口 void nameWindow(const string& winname, int flags=WINDOW_AUTOSIZE);

//例子:创建一个自动根据图片大小调整的窗口,其名字为“hello world!”

void nameWindow("hello world!", WINDOW_AUTOSIZE);

//第一个参数为窗口名,第二个参数(默认为WINDOW_AUTOSIZE):WINDOW_NORMAL或者0, 可手动更改窗口大小;WINDOW_AUTOSIZE或者1, 窗口自动适应图片大小,用户无法更改窗口大小;WINDOW_OPENGL或者2, 创建窗口是支持OpenGL。

输出、存储图像 bool IMwrite(const string& filename, InputArray img);

//例子:将frame存储到D盘中opencv学习文件夹下的名为test_save的JPG格式图片

imwrite("D:\\opencv学习\\test_save.jpg", frame);

2. =============滚动条的创建====================

滚动条的创建 int createTrackbar(conststring& trackbarname, conststring& winname, int* value, int count, TrackbarCallback onChange=0, void* userdata=0);

第一个参数:滚动条的名字;第二个参数:滚动条绑定的窗口;第三个参数:滚动条初始值;第四个参数:滚动条最大值;第五个参数:回调函数的指针(回调函数定义格式为:void function_name (int, void*),第一个参数为滚动条的位置,第二个参数为用户数据,也就是下面的第六个参数);第六个参数:用户提供给回调函数的数据,如果没有课省略。

//例子:利用滚动条实现图片的亮度度变化

#include <opencv2/opencv.hpp>
#define WindowName "Test"       //定义窗口名字的宏
using namespace cv;		//使用命名空间,那么在程序中使用cv的语法时就不需要加前缀"cv::"

char Trackbarname[50];		//滑动条的名称
int pre_place,chack;		//滑动条对应的变量
const int max_place = 100;	//定义Trackbar的最大值
double d;			//比例值,用于改变图像的亮度


Mat frame;			//定义Mat类型的frame变量,用于存储图像
//Trackbar的回调函数定义
void on_Change(int,void*){
	pre_place = getTrackbarPos(Trackbarname, WindowName);	//获取滑动条当前位置
	createTrackbar(Trackbarname,WindowName,&pre_place,max_place,on_Change);	//更新滑动条的数据
	frame = imread("1.jpg",1);	        //读取图像
	d = (double)pre_place/max_place;        //比例值等于当前滑动条的位置除以最大值
	frame *= d;				//改变图像的亮
	imshow(WindowName,frame);		//显示图像
	waitKey(0);
}
int main(){
	namedWindow(WindowName,WINDOW_AUTOSIZE);    //定义自动适应图片大小的窗口
	pre_place = 100;			    //滑动条的初始位置
	sprintf(Trackbarname,"亮度值%d",max_place);  //sprintf函数,格式化赋值
	createTrackbar(Trackbarname,WindowName,&pre_place,max_place,on_Change); //创建滑动条
	on_Change(pre_place,0);			    //在回调函数中显示
	return 0;
}

效果

    

❤获取滑动条当前位置:getTrackbarPos(conststring& trackbarname, conststring& winname);

第一个参数:滑动条的名字;第二个参数:绑定窗口的名字; 使用例子:

pre_place = getTrackbarPos(TrackbarName, WindowName);    //接上面的例子,获取滑动条的当前位置

3.===========鼠标操作===================

❤鼠标操作:setMouseCallback(conststring& winname, MouseCallback onMouse, void* userdata=0)

第一个参数:窗口名字;第二个参数:鼠标的回调函数,是指定窗口里每次鼠标事件发生的时候,被调用的函数指针。这个回调函数的定义格式为:void Foo(int event, int x, int y, int flags, void* param); 第三个参数:用户提供给回调函数的数据。

//例子:用鼠标在图片中画出矩形

#include <opencv2/opencv.hpp>
#define WindowName "Test"	//定义窗口名字的宏
using namespace cv;		//使用命名空间,那么在程序中使用cv的语法时就不需要加前缀"cv::"

/*========声明函数==============*/
void on_MouseHandle(int event,int x,int y, int flags, void* param);
void DrawRectangle(Mat& img, Rect box);

/*========定义全局变量==============*/
Rect g_rectangle;
bool g_bDrawingBox = false;	//作为是否绘制矩形的判断条件
Mat srcImage(600,800,CV_8UC3), tempImage; //生成一个行列为600*800的8位3通道的图像(默认灰色),并定义一个Mat类型的tempImage变量
RNG g_rng(12345);

/*========主函数==============*/
int main(){
	g_rectangle = Rect(-1,-1,0,0);	//赋初始值
	srcImage.copyTo(tempImage);
	srcImage = Scalar::all(0);	//设置srcImage图像全黑

	namedWindow(WindowName);
	setMouseCallback(WindowName, on_MouseHandle, (void*)& tempImage);    //鼠标事件发生的函数操作命令

	while(1){
		if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);    //绘制矩形框,DrawRectangle函数会改变图片的值
		imshow(WindowName, tempImage);
		if(waitKey( 10 ) == 27) break;		//按下Esc键时退出
	}
	return 0;
}
/*========鼠标事件的回调函数==============*/
void on_MouseHandle(int event,int x,int y, int flags, void* param){
	Mat& image = *(Mat*) param;
	switch (event){
		//按下鼠标左键时执行的函数
		case EVENT_LBUTTONDOWN:{
			g_bDrawingBox = true;
			g_rectangle = Rect(x,y,0,0);//记录起始点
		}
			break;
		//鼠标左键弹起时执行的函数
		case EVENT_LBUTTONUP:{
			g_bDrawingBox = false;		//当鼠标左键弹起时,停止绘制框图
			if( g_rectangle.width < 0){	//反方向绘制矩形的参数变化
				g_rectangle.x += g_rectangle.width;
				g_rectangle.width *= -1;
			}
			if(g_rectangle.height<0){
				g_rectangle.y += g_rectangle.height;
				g_rectangle.height *= -1;
			}
			DrawRectangle(srcImage, g_rectangle);	//保存绘制矩形框后的图像
		}
			break;
		//鼠标移动时执行的函数
		case EVENT_MOUSEMOVE:{
			if(g_bDrawingBox){
				g_rectangle.width = x-g_rectangle.x;
				g_rectangle.height = y - g_rectangle.y;
			}
			srcImage.copyTo(tempImage);		//保证一次鼠标按键绘制一个矩形框
		}
			break;
	}
}
/*========绘制随机彩色矩形框函数==============*/
void DrawRectangle(Mat& img, Rect box){
	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255), g_rng.uniform(0,255)));
}

效果:

以上程序包括自己编写的和参考的,亲测程序运行没有问题,关于opencv图形用户界面的基础操作学习笔记到此,后续继续积累其他章节笔记。

おすすめ

転載: blog.csdn.net/qq_34917728/article/details/79380032