GUI接口的制作-Trackbar制作

上一篇,有关于图像GUI相关的都已经介绍到,接着,就来加入Trackbar来做影像黑白图(二值图)的实例,在这里,全彩图要转成黑白图就必须要先转成灰级图,变成灰级图之后就必须要配置一个门槛值才能转成黑白图,这边则是用Trackbar来做动态门槛值的校调.

RainMan二值化制做(图像,窗口,拉轴实例)
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>


void * WindowHandle1;

char FileName[]="rain.jpg";
char TrackbarName[]="Threshold";

int TrackbarInitValue=180;
int TrackbarStopValue=255;

IplImage *Image1;
IplImage *Image2;
CvSize Image2Size;

void onTrackbar(int position);

int main()
{
    Image1 = cvLoadImage(FileName,CV_LOAD_IMAGE_GRAYSCALE);
    Image2Size = cvSize(Image1->width,Image1->height);
    Image2 = cvCreateImage(Image2Size,IPL_DEPTH_8U,1);

    cvNamedWindow("Show Image",0);
    cvMoveWindow("Show Image",0,0);
    cvResizeWindow("Show Image",300,400);

    cvCreateTrackbar(TrackbarName,"Show Image",&TrackbarInitValue,TrackbarStopValue,onTrackbar);
    printf("Now, Trackbar position is : %d\n",cvGetTrackbarPos(TrackbarName,"Show Image"));
    cvSetTrackbarPos(TrackbarName,"Show Image",177);

    WindowHandle1=cvGetWindowHandle("Show Image");
    printf("The Window Handle is : %d\n",WindowHandle1);
    printf("The Window Name is : %s\n",cvGetWindowName(WindowHandle1));

    cvShowImage("Show Image",Image1);

    cvWaitKey(0);

    cvDestroyWindow("Show Image");
    cvReleaseImage(&Image1);
    cvReleaseImage(&Image2);

}
void onTrackbar(int position)
{
    cvThreshold(Image1,Image2,position,255,CV_THRESH_BINARY);
    cvShowImage("Show Image",Image2);
}

执行结果:


跟 前一篇程序代码比起来,这边多创造了IplImage数据结构的Image2及一个CvSize数据结构的Image2Size,然后初始化 Image2Size的大小为Image1的宽跟高,再用cvCreateImage()初始化Image2的图像空间,这边给Image2,8比特1个 信道非负整数空间,也就是开了一个非负整数0~255的二维数组,设立一个新的窗口,加上了cvCreateTrackbar()的函数,而使用 cvCreateTrackbar()必须要给予Trackbar一个事件,事件的命名可以自由的取名字,这里给它的事件名称是void onTrackbar(int postion),缺省Trackbar的位置在180,最大拉轴长度是255,用cvGetTrackbarPos()查看拉轴位置,再用 cvSetTrackbarPos()重新定位拉轴位置为177,接着,在onTrackbar()中放入了cvThreshold()算法函数,再用 cvSohwImage()显示二值化的结果.要注意的是,配置事件名称的时候最好也符合命名规则,增加可读性,在这边OpenCV可写的事件比一般 GUI接口还少很多,如果有瞭解过GUI的事件(Event),大概就晓得为啥要这样设计.
接着逐一介绍各子程序的功能,从"highgui.h"的开始:

cvCreateTrackbar()
建 立一个Trackbar在目标窗口上,起始值从0开始,而Trackbar指标开始的位置跟Trackbar最大值要自己配置,再给他一个可控制的事件名 称,此Trackbar事件可自由命名,但是务必要让他输入一个int类型的变量如:void xxx(int position).
cvCreateTrackbar("Trackbar名称","目标窗口名称",指标开始数值,Trackbar最大值,Trackbar事件子程序名称);

cvGetTrackbarPos()
检视Trackbar的位置,需要给它Trackbar的名称,目标窗口名称.
int cvGetTrackbarPos("Trackbar名称","目标窗口名称");

cvSetTrackbarPos()
重新配置Trackbar的位置,需要给它Trackbar的名称,目标窗口名称.
cvGetTrackbarPos("Trackbar名称","目标窗口名称",新的拉轴位置数据);

接下来都非highgui.h的函数

cvSize()
初始化CvSize数据结构,放置长跟宽的整数值
CvSize cvSize(宽的数值,高的数值);

cvCreateImage()
初始化IplImage数据结构,创造一个空白的图片基本的格式,格式内容可参考命名规则,再给他信道数(二维数组的数目).
cvCreateImage(CvSize数据结构,IPL_DEPTH_系列参数,信道数);

onTrackbar()
自行定义名称,主要是接收拉轴移动后的数值,此数值做为二值化的门槛值,通常拉轴移动的数值都是做为各个算法的门槛值之用.
void onTrackbar(拉轴移动整数值);

cvThreshold()
此为算法功能之ㄧ,跟门槛值相关的算法搜集的子程序,第一个参数为输入图,第二个参数为计算结果的图,再来是门槛最大值,二值化门槛值参数.
cvThreshold(原始图像IplImage数据结构,计算后结果IplImage数据结构,门槛值,最大门槛值数值,CV_THRESH_BINARY);