HighGUI学习总结

HighGUI
HightGui是一个可以移植的图形工具包。
OpenCV将与操作系统,文件系统,摄像机之类的硬件进行交互的一些函数纳入HighGui(high-level graphical user interface)库中,有了HighGui,我们可以方便的打开窗口,显示图像,读出或者写入图像相关的文件(包含图像与视屏),处理简单的鼠标,光标和键盘事件。也可以使用HighGui创建其他一些很有用的控件,如滑动条,并把它加入窗口。
为了好理解,我们认为OpenCV中的HighGui可以分为三部分-------硬件相关部分,文件部分以及图像用户界面部分
注:事实上,HighGui的结构实现与我们所表述的不尽相同,HighGui函数实际别划分为 “视屏输入\输出”,”图像输入\输出“,”GUI工具“三部分。

(1),硬件相关部分最主要的就是对于摄像机的操作,在大多操作系统下,与摄像机交互是一件很复杂并且很痛苦的工作。HighGui提供了一种从摄像机中获取图像的简单方法

(2),文件系统部分的主要工作是载入和保存图像文件。HighGui一个很好的特点就是可以用读取摄像机视屏相同的方法读入视屏文件。HighGui为我们提供了一对函数来读入与保存图像,这两个函数根据文件名的后缀,自动完成所有编码和解码工作。

(3),HighGui的第三部分是窗口系统(或者成为GUI),HighGui提供一些简单的函数用来打开窗口以及将图像显示在窗口中。它同时给我们提供了为窗口加入鼠标,键盘相应的方法。

imread函数

函数原型:Mat imread( const String& filename, int flags )

filename 想要读取/加载的图片文件名称

flags 标志位,该标志位影响imread最终读取图片转换成Mat的数据存储形式。
它的取值限于枚举类ImreadModes中。默认值IMREAD_COLOR。
默认值为1
可决定图像大小

IMREAD_UNCHANGED标志决定了是否有alpha通道

注意:
色彩通道
灰度图通常都是8 bit的像素深度, 通道数为1
彩色RGB图一般是24bit的像素深度通道数为3
32bit的彩色图一般包含RGBA四个通道,其中A表示的是透明度索引
其他彩色图(16bit或者32bit)压缩RGB格式或者YUV格式,通道数为2,需要手动分离
存放顺序
默认是BGR的顺序依次存放到0,1,2通道中
数据存储
读入的数据被存入一个二维数组中, 图像数据占用的内存大小为(单位:字节)
rows * cols * depth,rows是图像像素的行数cols是图像像素的列数 depth是图像颜色深度,灰度图一般是1 ,RGB图一般是3

InputArray类型
InputArray是代理数据类型,相当于一个接口
InputArray这个接口类可以是

Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>vector<Mat>

InputArray输入的矩阵是个空参数,你只需要用cv::noArray()作为参数即可简单的把它当做Mat类型即可

namedWindow()函数
namedWindow函数通过指定的名字,创建一个可以作为图像和进度条的容器窗口。
如果具有相同名称的窗口已经存在,则函数不做任何事情。
函数原型为:`

namedWindow(const string& filename, int flag=WINDOW_AUTOSIZE )`

filename指窗口的名称;
flag指创建的窗口类型,默认为WINDOW_AUTOSIZE,即1. 窗口可以自适应。
Flag=0,表示按原图尺寸显示。窗口的标识,一般默认为WINDOW_AUTOSIZE 。
WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。
WINDOW_NORMAL 用户可以改变这个窗口大小
WINDOW_OPENGL 窗口创建的时候会支持OpenGL

imwrite()函数
用来保存图片
其声明如下:

CV_EXPORTS_W bool imwrite( const String& filename, InputArray img,const std::vector<int>& params = std::vector<int>());

简单来说就是:
cv2.imwrite(1.“图片名字.格式”,2.Mat类型的图像数据,3.特定格式保存的参数编码,默认值std::vector() 所以一般可以不写)
第一个参数const String& filename表示需要写入的文件名,必须要加上后缀,比如“123.png”。
第二个参数InputArray img表示Mat类型的图像数据。
第三个参数const std::vector& params表示为特定格式保存的参数编码,它有一个默认值std::vector< int >(),所以一般情况下不用写。

1、filename:需要写入的文件名,会自己创建(像imwrite(“1.jpeg”,src);这样)
2、img:要保存的图像
3、params:表示为特定格式保存的参数编码
注意:你要保存图片为哪种格式,就带什么后缀。

滑动条—createTrackbar()函数
用于创建一个可以调整数值的滑动条(常常也被称作轨迹条),并将滑动条附加到指定的窗口上,使用起来方便。
可以在显示图像的窗口快速创建一个滑动控件,用于手动
调节阈值,效果非常直观。
函数原型如下:
int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0);
trackbarname:滑动空间的名称;
winname:滑动空间用于依附的图像窗口的名称;
value:初始化阈值;

阈值:界限,故阈值又叫临界值,是指一个效应能够产生的最低值或最高值 详细的说,阈值是一个转换临界点,不管你的图片是什么样的彩色,它最终都会把图片当黑白图片处理,也就是说你设定了一个阈值之后,它会以此值作标准,凡是比该值大的颜色就会转换成白色,低于该值的颜色就转换成黑色,所以最后的结果是,你得到一张黑白的图片。
用阈值的作用:得到一张对比度不同的黑白图片 阈值可以是最小值:某一性能特征不能低于该值。

count:滑动空间的刻度范围;
TrackbarCallback是回调函数;

回调函数详解:
打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to
register a callback function)

每次滑块位置改变时,这个函数都会进行回调。
这个createTrackbar函数,为我们创建一个具有特定名称和范围的轨迹条(Trackbar,或者说是滑块范围控制工具),指定一个和轨迹条位置同步的变量。而且要指定回调函数onChange(第五个参数),在轨迹条位置改变的时候来调用这个回调函数。并且我们知道,创建的轨迹条显示在指定的winname(第二个参数)所代表的窗口上。

getTrackbarPos()函数
用于获取当前轨迹条的位置
函数原型如下:
C++: int getTrackbarPos(const string& trackbarname, const string& winname)
第一个参数:conststring& trackbarname,表示轨迹条的名字
第二个参数:conststring& winname,表示轨迹条依托窗口的名称

鼠标操作—SetMouseCallback函数
为指定的窗口设置鼠标回调函数
函数原型如下:
c++: void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
winname:窗口的名字
onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。
这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
userdate:传给回调函数的参数

MouseCallback onMouse的函数原型:

void on_Mouse(int event, int x, int y, int flags, void* param);

event 是 CV_EVENT_*变量之一
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
flags 是CV_EVENT_FLAG的组合,
param是用户定义的传递到setMouseCallback函数调用的参数。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
09-20 399

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值