[OpenCV]4 关于HighGUI

通过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
);
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参数。

<span style="font-family:Microsoft YaHei;font-size:18px;">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;
    }
} 

 
时间: 2024-10-28 23:06:13

[OpenCV]4 关于HighGUI的相关文章

[OpenCV]3 关于HighGUI

 通过HighGUI(high-level graphical user interface)可以实现打开窗口.显示图像.读出和写入图像文件,处理鼠标.光标.键盘事件.而HighGUI主要分成"视频输入/输出"."图像输入/输出"和"GUI工具",分别在cacap*.grfmt*和window*源文件中实现. <span style="font-family:Microsoft YaHei;font-size:18px;&qu

调用opencv相关函数,从视频流中提取出图片序列

/************************ @HJ 2017/3/30 参考http://blog.sina.com.cn/s/blog_4b0020f301010qcz.html修改的代码 @主要调用opencv相关函数,从视频流中提取出图片序列 @需要注意的问题: cvReleaseImage(&pImg)释放内存出错的两种情况:具体可以参考http://www.cnblogs.com/grandyang/p/4615036.html 1)从摄像头获取的图片不能被修改和释放,所以如果

《OpenCV3编程入门》学习笔记三:HighGUI图形用户界面

一:内容介绍 本节主要介绍OpenCV的HighGUI模块,并分享几个例子: 1. 用imwrite函数生成png透明图 2. 综合示例程序:图像的载入.显示与输出 3. 为程序界面添加滑动条 4. 鼠标操作 二:学习笔记 1. 使用OpenCV首先要学会使用它的图形界面,此章节介绍了OpenCV的一些HighGUI使用方法,并不涉及什么理论部分.关于HighGUI大家可参考官网HighGUI模块 http://docs.opencv.org/3.1.0/d7/dfc/group__highgu

3. opencv进行SIFT特征提取

opencv中sift特征提取的步骤 使用SiftFeatureDetector的detect方法检测特征存入一个向量里,并使用drawKeypoints在图中标识出来 SiftDescriptorExtractor 的compute方法提取特征描述符,特征描述符是一个矩阵 使用匹配器matcher对描述符进行匹配,匹配结果保存由DMatch的组成的向量里 设置距离阈值,使得匹配的向量距离小于最小距离的2被才能进入最终的结果,用DrawMatch可以显示 代码 // 使用Flann进行特征点匹配

opencv在hisi上的移植总结

经本人尝试opencv249在arm-hisiv200-linux-g++ 可以编译通过,在arm-hisiv100-linux-g++ 下编译会出现错误.本文分别介绍在arm-hisiv200-linux-g++ 和arm-hisiv100-linux-g++ 下opencv的编译方式. 一.arm-hisiv200-linux-g++交叉编译链 Ubuntu12.04 OpenCV-2.4.9 1.在/home下新建文件夹 # mkdir opencv249 把下载的OpenCV-2.4.9

VS2013配置OpenCV3.0

第一步:你得有VS2013和OpenCV3.0 alpha(我下的这个,之前的3.0还不稳定) 第二步:提取OpenCV,目录自己定,我用的 F:\opencv 第三步:配置环境变量 计算机->属性 1.系统变量->新建 变量名:OPENCV · 变量值:F:\opencv  (提取的目录) 2.Path: 系统变量中的path添加 变量值:;%OPENCV%\x86\vc12\bin 第四步:新建文件opencv300.props(这是为了VS引用,减少工程设置) 点击下载 第五步:测试及使

一起做RGB-D SLAM (2)

第二讲 从图像到点云 本讲中,我们将带领读者,编写一个将图像转换为点云的程序.该程序是后期处理地图的基础.最简单的点云地图即是把不同位置的点云进行拼接得到的. 当我们使用RGB-D相机时,会从相机里读到两种数据:彩色图像和深度图像.如果你有Kinect和ros,可以运行: 1 roslaunch openni_launch openni.launch 使Kinect工作.随后,如果PC连接上了Kinect,彩色图像与深度图像就会发布在 /camera/rgb/image_color 和 /cam

opencv3.2.0 Cmake 3.8.0 编译问题

opencv3.2.0 Cmake 3.8.0 TDM-GCC 5.1.0 Windows 7 遇到如下错误 [ 53%] Building CXX object modules/world/CMakeFiles/opencv_world.dir/__/videoio/ src/cap_vfw.cpp.obj [ 53%] Building CXX object modules/world/CMakeFiles/opencv_world.dir/__/videoio/ src/cap_ffmpe

RGB-D点云生成

bin文件夹下为生成的可执行文件generate_cloud,执行时和data文件放在同一文件夹下. 图像数据来自小觅相机. src下的源码,包括generatePointCloud.cpp和CMakeLists.txt // C++ 标准库 #include <iostream> #include <string> //#include <unistd.h> using namespace std; // OpenCV 库 #include <opencv2/c