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

GUI接口的制作-打开图像

2012-04-28 11:01 260 查看

http://fzzl.isprogrammer.com/tag/OpenCV%E7%AA%97%E5%8F%A3%E6%8E%A5%E5%8F%A3%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1?page=12

本文的重点就是"highgui.h"这个函数库,"highgui.h"提供了许多基本的功能,实际上用起来也不麻烦,主要是简单好用吧,但功能性不是很强大,不比Visual C++的mfc及C++ Builder的vcl好用的多,如果真的需要强大的GUI功能,则就把OpenCV引入Visual C++及C++ Builder的函数库吧.这边所提供,OpenCV的GUI接口功能分为图片(Image),视频(Capture),窗口(Form),拉轴 (TrackBar),鼠标,键盘,AVI文件的播放,有点少,不过够用,我们拿前面的RainMan实例来做GUI接口的说明.

RainMan灰度(窗口,图像操作)

#include <stdio.h>

#include <cv.h>

#include <highgui.h>

void * WindowHandle1;

char FileName[]="rain.jpg";

IplImage *Image1;

int main()

{

Image1 = cvLoadImage(FileName,CV_LOAD_IMAGE_GRAYSCALE);

cvNamedWindow("Show Image",0);

cvMoveWindow("Show Image",0,0);

cvResizeWindow("Show Image",300,400);

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);

}

执行结果:





这里用了许多"highgui.h"现有的函数,如

cvLoadImage()

cvNamedWindow()

cvMoveWindow()

cvResizeWindow()

cvGetWindowHandle()

cvGetWindowName()

cvShowImage()

cvWaitKey()

cvDestroyWindow()

cvReleaseImage()

也可以说,除了IplImage及printf()其他都是"highgui.h"内建的函数,程序代码的一开始,就用(void *)类型创建了一个Window Handle的窗口ID变量,接着就对窗口作位移及缩放,再来拿到widow handle ID,再用handle ID去获取窗口字串名称,显示图片,执行键盘事件,清空內存,这边搜寻Window Handle的好处是,可以对窗口做一些基本的沟通,但这是在Win32里面的教学,不在OpenCV的范畴之内.接着来逐一说明各函数的功用

cvLoadImage()

顾名思义,就是加载图片的意思,它的使用方法为

IplImage* cvLoadImage("文件名称",参数);

参数的部分可以参考命名规则的说明,回传的讯息是IplImage数据结构,它的参数分类有:

#define CV_LOAD_IMAGE_UNCHANGED -1 原始图像

#define CV_LOAD_IMAGE_GRAYSCALE 0 灰度图

#define CV_LOAD_IMAGE_COLOR 1 彩色图

#define CV_LOAD_IMAGE_ANYDEPTH 2 任何颜色深度

#define CV_LOAD_IMAGE_ANYCOLOR 4 任何彩色

原始图像如果是灰度的话会因为文件格式的关系而不可能变成彩色,但彩色图片却可以任意变成灰度图,参数的部分可以用大写英文或数字来替代.

cvNamedWindow()

这个子程序,是给窗口化接口命名的子程序,用法如下

cvNamedWindow("窗口名称",参数);

而它的参数实质上只有一个

#define CV_WINDOW_AUTOSIZE 1 自动调整图像大小

AUTOSIZE 可以让图片便成原图大小,也就是图像维度不做调整,但是图片太大很容易造成困扰,就如RainMan,维度为1200*1600,会造成图片占据了整个屏幕的版面.如果要微调就要用到cvResizeWindow()这个函数,但是,cvNamedWindow()不能设成 1(CV_WINDOW_AUTOSIZE),务必将参数设为0或其他非1的数字.

cvMoveWindow()

移动GUI窗口到"屏幕座标"上的位置.当我们移动鼠标时,实际上是在Windows操作系统内部的坐标轴在变换,这个函数可以将做出来的GUI窗口以右上角为准移动到指定萤幕座标的地方.使用方法:

cvMoveWindow("窗口名称",屏幕X轴坐标,屏幕Y轴坐标);

cvResizeWindow()

将窗口作缩放的动作,图片将会等比例的变换,但cvNamedWindow()参数必须设为非1.

cvResizeWindow("窗口名称",缩放宽度,缩放高度);

cvGetWindowHandle()

一个窗口所产生的ID,当我们建立一个窗口的时候,操作系統个随机给予一个窗口ID,每次重新打开这个ID都会不一样,可以把它视为纯数字,不过,通常都是用(void *)数据类型来设立,这边就是用窗口名称来找窗口ID

cvGetWindowHandle("窗口名称");

cvGetWindowName()

用ID来反查窗口名称.

cvGetWindowName(窗口ID);

cvShowImage()

显示图片.

cvShowImage("窗口名称",IplImage数据结构或CvArr数据结构);

cvWaitKey()

键盘事件,显示图像必备,这边如果有打开cvShowImage()的话,就必须要用到cvWaitKey(),而不能用"stdlib.h"里的 system("pause")替换,cvWaitKey()是专门在在OpenCV专用的GUI接口底下等待键盘命令的,而不是在黑白环境下的命令提示 字符,键盘事件有两种,阻断式(block)的跟非阻断式(unblock)的可以在操作系統原理的相关书籍读到,阻断式的就是 cvWaitKey(0),它会一直等待到键盘事件发生为止,另一种就是在里面输入大于零的数字cvWaitKey(10),它将会等到10毫秒后自动输
出-1,代表10毫秒内没接收到键盘敲击事件,因此,典型的子程序表示法为

cvWaitKey(数字);

cvDestroyWindow()

清除窗口內存

cvDestroyWindow("窗口名称')

cvReleaseImage()

清除IplImage图像数据结构內存

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