OpenCV学习心得——基础篇——跨平台与Windows系统——基于Qt后端的HighGUI接口
FOR THE SIGMA
FOR THE GTINDER
FOR THE ROBOMASTER
简介:
这一系列的学习心得第一轮将参考《学习OpenCV3》一书
操作系统版本:Ubuntu16.04(在这里博主在Linux下进行运行的)
http://www.ubuntu.org.cn/download/desktop 桌面版ubuntu16.04 下载
电子版书籍下载地址
暂无资源
内容:
Opencv中基于HighGUI部分开发任何GUI功能都要依赖独立的库。因为有很多优秀的团队管理、维护和更新GUI工具包。通过基于Qt后端的HighGUI接口,我们可以设计出一个更加对用户体验感友好的UI出来。
注意:在编译Opencv时选择了QT支持的话,当你打开一个窗口时会自动包含两个新的特性,即工具栏与状态栏。如果你不想使用qt接口支持,但又不想要工具栏和状态栏等,你可以在调用cv::namedWindow()时增加一个输入标志cv::GUI_NORMAL。
操作菜单
使用cv::GUI_EXTENDED创建窗口时,工具栏会有一系列按钮。弹出菜单栏可以作为工具栏的替代方案,通过鼠标单击右键来显示。
文字蒙板
Qt的另一个可选项是能够放一个临时的条幅到展示图像的顶部。这可以用于展示一些简单的信息,比如在视频上展示视频帧的编号和帧率或是查看的图像名称。即使你使用了cv::GUI_NORMAL标志参数,也可以在窗口上展示蒙板。
int cv::displayOverlay(
const string& name, //添加蒙板的窗口的名称
const string& text, //需要展示的所有文本(文本框长度固定,否则会发生溢出)
int delay //蒙板出现在窗口的事件
);
注意:当delay的值设置为0时,蒙板将一直存在,直到你再次调用cv::displayOverlay()覆盖原来的蒙板。通常,在蒙版展示延迟结束前调用cv::displayOverlay()时,蒙板原来的文本内容将被替换为新的,无论原来的蒙板延迟有没有结束,延迟时间都会被重置为开始。
状态栏中写入自己的内容
在默认状态下,状态栏中包含鼠标光标所在位置的像素的信息。当然也可以通过cv::displayStaturbar()函数来替换状态栏中文本的值:
int cv::displayStatusBar(
const string& name,
const string& text,
int delay
);
注意:该函数只能在使用cv::GUI_EXTENDED标志创建窗口时调用,并且在文本显示延迟时间到了后(如果delay没有被置为0),状态栏会自动恢复默认的鼠标光标位置和光标所在像素RGB值的显示。
Qt中的滑动条
用原生库添加滑动条的函数为cv::createTrackbar()创建的。
在Qt上则是
int contrast = 128;
cv::createTrackbar( "Contrast:" . " ". &contrast, 255 ,on_change_contrast );
创建一个标签为“Contrast”的属性窗口。滑动值将从128开始,最大值是255.一旦滑动条开始发生变化,回调函数on_change_contrast()将会被调用。
创建一个按钮
int cv::createButton(
const string& buttonName, //自定义按钮名称
cv::ButtonCallback onChange = NULL, //回调函数,按钮点击时调用。
void* params, //回调函数
int buttonType = cv::PUSH_BUTTON, //取值见下
int initialState = 0
);
cv::ButtonCallback的定义:
void your_button_callback(
int state,
void* params
);
例如:
void switch_callback(int position, void*)
{
if (position == 0)
{
switch_off_function();
}
else
{
switch_on_function();
}
}
buttonType可以取如下三个值之一:
cv::PUSH_BUTTON 标准按钮,点击便会回调函数。
cv::RADIOBOX 单选按钮,同上,但是将同时调用当前点击按钮的回调函数与当前没有被点击的按钮和当前没有被点击的按钮。
cv::CHECKBOX 按钮值参数根据有没有选择复选框设置为1或0。
例如:
cv::nameWindow( "Image" , cv::GUI_EXPANDED);
cv::displayOverlay(" Image ",file_name, 0);
cv::createTrackbar(" Trackbar0"."Image",&mybar0,255);
cv::createTrackbar(" Trackbar1"."Image",&mybar1,255);
cv::createButton(" ",NULL , NULL, cv::PUSH_BUTTON);
cv::createButton(" ",NULL , NULL, cv::PUSH_BUTTON);
cv::createButton(" ",NULL , NULL, cv::PUSH_BUTTON);
cv::createTrackbar(" Trackbar2"."",&mybar1,255); //这是滑动按钮的
cv::createButton("Button3",NULL , NULL, cv::RADIOBOX,1);
cv::createButton("Button3",NULL , NULL, cv::RADIOBOX,0);
cv::createButton("Button3",NULL , NULL, cv::CHECKBOX,0);
文本与字体
使用Qt接口写文本必须首先创建一个CvFont对象。
CvFont fontQt(
const string& fontName, //系统的字体名称例如“Times”,若系统没有会分配默认字体
int pointSize, //字体大小,设置为0,则大小为默认值12
cv::Scalar color = cv::Scalar::all(0), //字体颜色默认为黑色
int weight = cv::FONT_NORMAL, //字体粗细
int spacing = 0 //字符间距,取值正负都行
);
Qt字体粗细预定义名称与其相关联的值
字体预定义名称 | 数值 |
---|---|
cv::FONT_LIGHT | 25 |
cv:::FONT_NORMAL | 50 |
cv::FONT_DEMIBOLD | 63 |
cv::FONT_BOLD | 75 |
cv::FONT_BLACK | 87 |
放置文本
void cv::addText(
cv::Mat& image, //写入图像对象-image
const string& text, //文本内容
cv::Point location, //写入文本的位置
CvFont* font //文本字体
);
设置和获取窗口属性
void cv::setWindowProperty(
const string& name,
int prop_id,
double prop_value
);
double cv::getWindowProperty(
const string& name,
int prop_id
);
setWindowProperty()函数提供了窗口名和属性ID。
可设置的获取的窗口属性:
属性名称 | 描述 |
---|---|
cv::WIND_PROP_FULL_SIZE | 设置为WINDOW_FULLSCREEN,窗口显示全屏,设置为WINDOW_NORMAL,窗口显示为正常尺寸 |
cv::WIND_PROP_AUTOSIZE | 设置为WINDOW_AUTOSIZE,可以使窗口大小自动调整为显示图像的大小,设置为WINDOW_NORMAL,将显示图像大小调整到窗口大小 |
cv::WIND_PROP_ASPECTRATI0 | 设置为cv::WINDOW_FREERATI0,可以使窗口有任意长宽比(用户调整窗口尺度);设置为cv::WINDOW_KEEPRATI0,只能按照固定长宽比例调整窗口大小(用户不能调整长宽比) |
保存与恢复窗口的状态
接口状态可以用cv::saveWindowParameters()函数进行保存
void cv::saveWindowParameters(
const string& name
);
一旦窗口保存好后,即可用互补函数cv::loadWindowParameters()来恢复
void cv::loadWindowParameters(
const string& name
);
需要注意的是即便你退出或重启程序,属性加载指令依然能够正常工作。状态信息无论保存到哪里,都是通过关键字来保存的,你可以通过改变可执行文件名,状态信息便不会保存。
参考:https://blog.csdn.net/jerry_csdn_zhou/article/details/78071756