GUI接口的制作-打开图像

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数据结构名称)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于MATLAB GUI的K-means算法图像聚类是一种常用的图像处理技术,旨在将图像中的像素点按照相似性进行分组。以下是一个300字的中文回答: K-means算法是一种无监督的机器学习算法,常用于图像聚类任务。MATLAB是一种强大的数学计算软件,提供了图形用户界面(GUI)工具包,使得编写和运行K-means算法更加简单便捷。 要在MATLAB GUI中实现K-means图像聚类,可以按照以下步骤进行: 1. 数据准备:将要处理的图像加载到MATLAB环境中,并将其转换为数字矩阵形式表示。可以使用imread函数读取图像,并用rgb2gray函数将其转换为灰度图像。 2. 初始化:选择要聚类的像素点数量,即确定聚类中心的数量。在GUI中,可以设置一个滑动条或者编辑框来动态调整聚类中心的数量。 3. 初始化聚类中心:使用随机或者其他策略选择初始聚类中心。可以使用randperm函数从图像中随机选取K个像素点作为初始聚类中心。 4. 迭代计算:根据K-means算法的原理,对每个像素点计算其与每个聚类中心的距离,并将其分配到距离最近的聚类中心。然后,根据新的聚类结果重新计算聚类中心。 5. 结果展示:将聚类结果可视化展示出来。可以在GUI中添加一个图像显示框,将不同聚类的像素点用不同颜色标记,形成聚类分割的效果。 在MATLAB GUI中实现K-means图像聚类,可以方便地调整参数和观察结果,提供了更好的交互性和可视化效果。通过这种方式,我们可以更好地理解和分析图像数据,提取出图像中的特定模式和信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值