GUI接口的制作-打开图像

风在竹林 posted @ 2009年7月12日 10:31 in OpenCV with tags OpenCV窗口接口程序设计 , 2334 阅读

本文的重点就是"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数据结构名称)


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter