文档章节

【OpenCV归纳】4 关于HighGUI

NoMasp
 NoMasp
发布于 2015/09/08 21:45
字数 1251
阅读 88
收藏 1


通过HighGUI(high-level graphical user interface)可以实现打开窗口、显示图像、读出和写入图像文件,处理鼠标、光标、键盘事件。而HighGUI主要分成“视频输入/输出”、“图像输入/输出”和“GUI工具”,分别在cacap*、grfmt*和window*源文件中实现。

int cvNamedWindow 
( const char* name, 
  int flags=CV_WINDOW_AUTOSIZE 
);

int cvNamedWindow
( const char* name,
  int              flags=CV_WINDOW_AUTOSIZE
);

第一个参数用来表示新窗口的名称,这个名称显示在窗口的顶部,同时用作HighGUI中其他函数调用窗口的句柄。第二参赛是个标志,用来表示是否需要使窗口大小自动适应读入的图像大小。释放可以用cvReleaseImage()和cvDestroyWindow()来实现。

       载入图像可以用cvLoadImage(),当打开一副图像时,该函数并不分析文件扩展名,而是通过分析图像文件的前几个字节来确定图像的编码格式。注意:当cvLoadImage()读入失败时,并不会产生一个运行时错误,而是返回一个空指针。与cvLoadImage()对应的函数是cvSaveImage(),其实现了保存图像功能。

IplImage* cvLoadImage 
( const char* filename, 
  int              iscolor=CV_LOAD_IMAGE_COLOR 
); 
 
int cvSaveImage 

 const char*   filename, 
 const CvArr* image 
);  
 IplImage* cvLoadImage
( const char* filename,
  int              iscolor=CV_LOAD_IMAGE_COLOR
);

int cvSaveImage
(
  const char*   filename,
  const CvArr* image
);

代码中的CvArr是C语言的风格,功能与面向对象语言中基类类似的结构。同样的显示图像可以用cvShowImage()。我比较喜欢读代码所以在此贴一段标准的实例吧。

int main(int argc,char** argv) 

    // Create a named window with the name of the file. 
    cvNamedWindow(argv[1],1]); 
 
    // Load the image from the given file name. 
    IplImage* img=cvLoadImage(argv[1]); 
 
    // Show the image the user hits the "Esc" key. 
    while(1) 
    { 
        if(cvWaitKey(100)==27) 
             break; 
     } 
     // Clean up and don't be piggies 
     cvDestoryWindow(argv[1]); 
     cvReleaseImage(&img); 
}
int main(int argc,char** argv)
{
    // Create a named window with the name of the file.
    cvNamedWindow(argv[1],1]);

    // Load the image from the given file name.
    IplImage* img=cvLoadImage(argv[1]);

    // Show the image the user hits the "Esc" key.
    while(1)
    {
        if(cvWaitKey(100)==27)
             break;
     }
     // Clean up and don't be piggies
     cvDestoryWindow(argv[1]);
     cvReleaseImage(&img);
}

   在cvLoadImage()中当然你也可以直接输入Linux地址。

void cvMoveWindow 
( const char* name, 
  int  x, 
  int  y 
);  

void cvMoveWindow
( const char* name,
  int  x,
  int  y
);

cvMoveWindow()将窗口移动到其左上角为x,y的位置。下面介绍要给很重要的函数。

while(1) 

    if(cvWaitKey(1000)==27) 
        break; 
}  
 while(1)
{
    if(cvWaitKey(1000)==27)
        break;
}

在这个程序中,则是告诉OpenCV等待用户触发事件100ms,如果在100ms内没有用户触发则继续循环;如果用户触发且按键ASCII码为27(ESC),则退出循环。

在鼠标事件中,和键盘当然最大的不同就是,鼠标响应事件采用回掉函数的方式来处理。因此为了可以响应鼠标点击事件,首先必须创建一个回掉函数。在创建这个函数之后需要在OpenCV中注册这个函数,以便特定窗口被触发鼠标事件后,OpenCV可以正确的调用这个函数。

void CvMouseCallback
(
   int event,
   int x,
   int y,
   int flags,
   void* param
);

event必须是以下表中的一个值。第二个以及第三个参数被设置成事件发生时鼠标位置的x,y坐标值。注意:这些坐标代表窗口中图像的像素坐标,与窗口的大小没有关系。第四个参数flags,每一位指定了在事件发生时的不同状态。例如CV_EVENT_FLAGS_SHIFTKEY的值为16(flags的第五位为1),如果想知道shift是否被触发,可以用flags与位掩码(1<<4)求与。最后一个参数是一个void指针,可以用来以任何结构方式传递额外的参数信息。

事件名称 数值
CV_EVENT_MOUSEMOVE 0
CV_EVENT_LBUTTONDOWN 1
CV_EVENT_RBUTTONDOWN 2
CV_EVENT_MBUTTONDOWN 3
CV_EVENT_LBUTTONUP 4
CV_EVENT_RBUTTONUP 5
CV_EVENT_MBUTTONUP 6
CV_EVENT_LBUTTONDBLCLK 7
CV_EVENT_RBUTTONDBLCLK 8
CV_EVENT_MBUTTONDBLCLK 9

实现注册的函数是cvSetMouseCallback(),该函数需要3个参数。第一个参数指定了回掉函数需要注册到的窗口,第二个参数为回掉函数,最后一个参数用来传递额外的信息给前面提到的void* param参数。

void cvSetMouseCallback 

    const char* window_name, 
    CvMouseCallback  on_mouse, 
    void* param=NULL 
); 

void cvSetMouseCallback
(
    const char* window_name,
    CvMouseCallback  on_mouse,
    void* param=NULL
);

以下是一个完整的实例。

#include<cv.h> 
#include<highgui.h> 
 
void my_mouse_callback(int event, int x, int y, int flags, void* param); 
 
CvRect box; 
bool drawing_box = false; 
 
// A litte subroutine to draw a box onto an image 
void draw_box(IplImage* img, CvRect rect) 

    cvRectangle(img,  
        cvPoint(box.x, box.y),  
        cvPoint(box.x + box.width, box.y + box.height), 
        cvScalar(0xff, 0x00, 0x00)); 

 
int main(int argc, char* argv[]) 

    box = cvRect(-1, -1, 0, 0); 
    IplImage* image = cvCreateImage( 
        cvSize(200, 200), 
        IPL_DEPTH_8U, 
        3); 
    cvZero(image); 
    IplImage* temp = cvCloneImage(image); 
    cvNamedWindow("Box Example"); 
 
    cvSetMouseCallback("Box Example", 
        my_mouse_callback, 
        (void*)image); 
 
    while (1) 
    { 
        cvCopyImage(image, temp); 
        if (drawing_box) 
            draw_box(temp, box); 
        cvShowImage("Box Example", temp); 
 
        if (cvWaitKey(15) == 27) 
            break; 
    } 
 
    cvReleaseImage(&image); 
    cvReleaseImage(&temp); 
    cvDestroyWindow("Box Example"); 

 
void my_mouse_callback(int event, int x, int y, int flags, void* param) 

    IplImage* image = (IplImage*)param; 
 
    switch (event) 
    { 
    case CV_EVENT_MOUSEMOVE: 
    { 
        if (drawing_box) 
        { 
            box.width = x - box.x; 
            box.height = y - box.y; 
        } 
    } 
        break; 
    case CV_EVENT_LBUTTONDOWN: 
    { 
        drawing_box = true; 
        box = cvRect(x, y, 0, 0); 
    } 
        break; 
    case CV_EVENT_LBUTTONUP: 
    { 
        drawing_box = false; 
        if (box.width < 0) 
        { 
            box.x += box.width; 
            box.width *= -1; 
        } 
        if (box.height<0) 
        { 
            box.y += box.height; 
            box.height *= -1; 
        } 
        draw_box(image, box); 
    } 
        break; 
    } 
}


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/43602337

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
OpenCV简介

OpenCV是Intel®开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 拥有包括 300 多个C函数的跨平台的中、高层 API。它不依赖于...

长平狐
2013/12/25
751
2
Ubuntu 全新编译安装 OpenCV 2.3

一段时间过去了,OpenCV出到2.3了,很兴奋地想试一试了,改进和增加了很多,具体请看http://opencv.willowgarage.com/wiki/OpenCV%20Change%20Logs 首先去下载OpenCV 2.3 for Linux 如果下载...

鉴客
2011/10/12
1K
1
OpenCV 2.1 new features

OpenCV 2.1 is basically a stabilized OpenCV 2.0, yet there are a few new features. >>> General modifications - SVN repository has been migrated from SourceForge to https://code.......

heartfly
2010/05/24
1K
0
Porting OpenCV 2.3.1 to iPhone 3GS/4/4S

Porting OpenCV 2.3.1 to iPhone 3GS/4/4S - 如何使用cmake+Xcode編譯OpenCV 2.3.1函式庫給iOS使用 要能在Xcode中使用OpenCV 2.3.1函式庫來實作自己的程式首要之務當然是要能建立出符合iOS使...

晨曦之光
2012/05/28
609
0
基于OpenCV的iOS图像处理

关于图片处理 随着科技的发展,AI、机器学习、AR、VR等已经逐渐走进生活,模式识别、图像捕捉、图片拼接等已经成为其中的重要环节。因此,图像处理技术在未来会被移动端广泛使用。其中,有很...

无忌不悔
2017/09/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数。 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只...

五分钟学算法
13分钟前
1
0
vuex mapActions

本文转载于:专业的前端网站➧vuex mapActions 在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在...

前端老手
14分钟前
2
0
使用bash -x 调试信息查看lvextend -r的调用

--1.打开调试: [root@db01 storage]# set -x --2.执行命令: [root@db01 storage]# /usr/sbin/lvextend -r -L 710M /dev/shazam/storage + /usr/sbin/lvextend -r -L 710M /dev/shazam/sto......

突突突酱
23分钟前
2
0
Linux重定向及反弹shell详解

这里说Linux重定向的原因主要还是为了详细了解一下Linux中的反弹shell 目录 0x01 文件描述符 0x02 重定向 0x03 反弹shell 0x04 交互重定向 0x05 命令变形 0x01 文件描述符 Linux的文件描述符...

无心的梦呓
28分钟前
2
0
开发经验 初学51单片机建议用C语言

typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   新手学习51单片机建议用C语言。因为使用C语言入门的话,上手速度快。实现几个例程后...

志成就
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部