您的位置:首页 > 产品设计 > UI/UE

OpenCv学习笔记(八)---细说HighGUI(图像用户界面)之滑动条createTrackbar()详解

2016-04-26 16:44 721 查看
(一)OpenCv中HighGUI(图形用户界面)的简述
1--OpenCv中将与操作系统,文件系统和摄像机之间的硬件交互的一些函数纳入了HighGUI
(high-level graphical user interface)高级图形用户界面的库中。有了HighGUI,
我们可以方便的打开窗口,显示图像,读出或者写入图像相关的文件(包含图像和视频),
处理简单的鼠标,光标,和键盘事件
2--也可以使用HighGUI创建其他很有用的控件,比如常见的滑动条,并且把它们加入到窗口,
如果对自己所使用的系统的图像用户界面非常熟悉,也许会认为HighGUI提供的很多功
能没有必要,但即使如此,HighGUI的跨平台性对你的帮助也会很大
3--OpenCv中的HighGUI可以分为三部分:
1---硬件相关部分
2---文件部分
3---图形用户界面部分
1---硬件部分最主要的----就是对于摄像机的操作,在大多数操作系统下,与摄像机交互是一
件很复杂并且痛苦的工作。HighGUI提供了一种从摄像机中获取图像的简单方法,所有
复杂的工作都在HighGUI内部完成
2---文件系统部分主要的工作就是载入与保存图像文件.HighGUI一个很好的特点就是可以用
与读取摄像机视频相同的方法读入视频文件。这使得我们可以省去处理从各种特定设备
中读入数据的麻烦
3---HighGUI的第三部分是窗口系统,或者成为GUI.HighGUI提供了一些简单的函数用来打开窗
口以及将图像显示在窗口中。它同时为我们提供了为窗口加入鼠标,键盘响应的方法,这些
函数为我们快速建立一个简单的应用程序提供了很大的帮助,一种变通的方式,我们可以使
用滑动条实现切换功能.我们发现使用HighGUI可以实现很多使用的程序
(二)OpenCv的命名空间
1--OpenCv中的C++类和函数都是定义在命名空间cv之内的
2--一般在写一个简答的OpenCv应用程序的时候,以下这三句是标配:
1--#include<opencv2/core/core.hpp>              //OpenCv中的核心模块,包括基本的数据结构和类型等
2--#include<opencv2/highgui/highgui.hpp>
3--using namespace cv;
(三)图像的载入与显示的概述
1--在OpenCv2中,最简单的图像载入和显示最需要两句代码,非常便捷.这两句代码分别对应两个
函数,它们分别是imread()以及imshow()
2--图像的载入:
Mat imread("图片的路径名",载入表示,它指定一个加载图片的颜色类型);
3--图像的显示:
void imshow("要显示的窗口标识",要显示的图像);
(四)关于InputArray类型和创建窗口
1--我们可以把InputArray简单的当做Mat类型即可
2--创建窗口:namedWindow()函数
namedWindow("被用作窗口的标识符的窗口名称",窗口的标识);
1--WINDOW_NORMAL----设置这个值,用户可以改变窗口的大小
2--WINDOW_AUTOSIZE--设置这个值,窗口的大小会自动的调整以适应显示的图像
3--WINDOW_OPENGL----设置这个值,窗口创建的时候会支持OpenGl
(五)输入图像到文件imwrite()函数
1--在OpenCv中,输出图像到文件一般采用imwrite函数,它的声明如下所示:
bool imwrite("填写需要写入的文件名.jpg",InoutArray img,一般不需要填写);
2--imwrite函数,用于将图像保存到指定的文件,图像格式是基于扩展名的
(六)waitKey()函数详解
1--waitKey()--这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下
键,则接续等待(循环)
2--如下所示:
while(1){
if(waitKey(100)==27)break;
}
在这个程序中,我们告诉OpenCv等待用户触发事件,等待时间为100ms,如果在这个时间段内,
用户按下ESC(ASCII码为27),则跳出循环,否则,则跳出循环
3--如果设置waitKey(0),则表示程序会无限制的等待用户的按键事件
(七)滑动条的创建和使用
1--滑动条(Trackbar)是OpenCv动态调节参数特别好的一种工具,它依附于窗口而存在
2--创建滑动条createTrackbar()函数:
1--createTrackbar函数用于创建一个可以调节整数值的滑动条,并将滑动条附加到指定
的窗口上,使用起来很方便。但需要记住,它往往会和一个回调函数配合起来使用
2--int createTrackbar("滑动条的名字","附加到窗口的名字",int* value,int count,
TrackbarCallback onChange=0;void userdata=0)
3--int* value--一个指向整形的指针,表示滑块的位置;在创建滑块是,滑块的初始
位置就是该变量当前的值
4--int count--滑块可以到达的最大位置
5--TrackbarCallback onChange=0----这是一个指向回调函数的指针,每次滑块位置
改变时,都会调用这个函数,并且这个函数的原型必须为void XXXX(int,void*)
1--其中第一个参数是轨迹的---位置
2--第二个参数是---用户数据
/*********************************************************************************************
程序功能:
滑动条的创建和使用
编写环境:
OpenCv2.4.8+VS2010
地点时间:
陕西师范大学 2016.4.26
作者信息:
九月
**********************************************************************************************/
/***********************************【函数的头文件和命名空间】********************************/
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace cv;

/******************************************【宏定义】****************************************/
#define WINDOW_NAME "【线性混合示例】"

/***************************************【全局变量声明部分】**********************************/
const  int nMaxAlphaValue=100;           //Alpha的最大值
int    nAlphaValueSlider;                //滑动条对应的变量
double dAlphaValue;
double dBetaValue;

//声明存储图像的变量
Mat srcImg1;
Mat srcImg2;
Mat dstImg;
/***************************************【全局函数声明部分】**********************************/

void trackBar(int,void*);

/********************************************【main函数】*************************************/
int main(int argc,char** argv)
{
//【1】载入两幅带有Alpha通道的图片
srcImg1=imread("D:\\17.png",CV_LOAD_IMAGE_COLOR);
srcImg2=imread("D:\\18.png",CV_LOAD_IMAGE_COLOR);

//【2】设置滑动条的初始位置为50
nAlphaValueSlider=50;

//【3】创建一个窗体
namedWindow(WINDOW_NAME,WINDOW_NORMAL);

//【4】在创建的窗体中创建一个滑动条
createTrackbar("透明值",WINDOW_NAME,&nAlphaValueSlider,nMaxAlphaValue,trackBar,0);

//结果在回调函数中显示
trackBar(nAlphaValueSlider,0);

//按任意键退出6
waitKey(0);
return 0;
}

/***************************************************************************************************
函数功能:
响应滑动条的回调函数
函数参数:
1---int------滑动条的位置
2---void*----用户数据
函数返回值:
无
***************************************************************************************************/
void trackBar(int,void*)
{
//求出Alpha值相对于最大值的比例
dAlphaValue=(double)nAlphaValueSlider/nMaxAlphaValue;
//beta值为1减去alpha值
dBetaValue=(1.0-dAlphaValue);

//根据alpha和beta的值进行现行混合
addWeighted(srcImg1,dAlphaValue,srcImg2,dBetaValue,0.0,dstImg);

//显示效果图
imshow(WINDOW_NAME,dstImg);
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: