==============图形用户界面入门内容===================
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图形用户界面的基础操作学习笔记到此,后续继续积累其他章节笔记。