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数据结构名称)
相关文章推荐
- GUI接口的制作-图像格式转换
- GUI接口的制作-打开AVI文件
- 用matlab gui 实现打开对话框选择图像
- MATLAB GUI图像处理->打开和保存图片
- 黑马程序员_温习 GUI图形用户接口二 (个人笔记)摘要(综合应用---对话框----菜单----Jar包打开方法)
- GUI接口的制作-"cvcam.h"视频函数库(1)
- Atitit 图像处理之编程之类库调用的接口api cli gui ws rest attilax大总结.docx
- MATLAB GUI 打开/显示/处理 /保存/图象(图像)程序
- 学习制作GUI界面
- opencv图像处理7-打开大图
- php基于curl扩展制作跨平台的restfule 接口
- matlab GUI中打开文件并做button的Callback
- opencv 学习第一天 学习opencv(中文版)第一个程序 打开一个图像
- deep learning 利用MATLAB制作GUI的数字识别可视化界面
- 基于MATLAB GUI的图像处理软件平台的开发(转自深寒的博客)
- Atitit 界面接口技术 cli gui nui cui管理 attilax总结 1. NUI 1 1.1. 问:什么是“自然用户界面”? 1 2. Cli到gui到nui CUI 2 2.1.
- Python3利用网页接口制作一个免费的VIP视频播放软件
- Matlab GUI,显示学生成绩(读取txt,xls文件),打开文件对话框
- QT5.8使用opencv打开图像窗口大小根据图像自适应调节
- 不能打开JPG图像,因为JPEG标识符段长度太短(该文件可能被阶段或不完整)