上一篇,有关于图像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);