【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

);

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;

}

}

时间: 2024-10-26 08:06:40

【OpenCV归纳】4 关于HighGUI的相关文章

【OpenCV归纳】1 体验OpenCV

#include "highgui.h" int main(int argc,char** argv) { IplImage* img=cvLoadImage(argv[1]); cvNamedWindow("Test1",CV_WINDOW_AUTOSIZE); cvShowImage("Test1",img); cvWaitKey(0); cvReleaseImage(&img); cvDestoryWindow("Test

【OpenCV归纳】2 读写视频

 除了读入图片之外,读写视频也足够简单易学,下面来看看如何读写视频吧. 播放硬盘中的视频: #include "highgui.h" int main(int argc,char** argv) { cvNamedWindow("Test2",CV_WINDOW_AUTOSIZE); CvCapture* capture=cvCreateFileCapture(argv[1]); IplImage* frame; while(1) { frame=cvQuery

【OpenCV归纳】3 在实例中学习简单函数以及数据读写

 实例一 int main() { IplImage*  img = cvLoadImage("6085.jpg", 1); IplImage* red = cvCreateImage(cvGetSize(img), img->depth, 1); IplImage* green = cvCreateImage(cvGetSize(img), img->depth, 1); IplImage* blue = cvCreateImage(cvGetSize(img), i

【OpenCV十六新手教程】OpenCV角检测Harris角点检测

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中,我们一起探讨了OpenCV

输出图像到文件 imwrite()[OpenCV 笔记7]

bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>()); filename 待写入的文件名.保存图像的格式由扩展名决定. img 一般为一个Mat类型的图像 params 特定格式保存的参数编码: JPEG:params表示0到100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值为95: PNG:params表示压

OpenCV for Python 学习 (二 事件与回调函数)

今天主要看了OpenCV中的事件以及回调函数,这么说可能不准确,主要是下面这两个函数(OpenCV中还有很多这些函数,可以在 http://docs.opencv.org/trunk/modules/highgui/doc/user_interface.html 找到,就不一一列举了),然后自己做了一个简单的绘图程序 函数如下: cv2.setMouseCallback(windowName, onMouse[, param]) cv2.createTrackbar(trackbarName,

图像处理简单实例[OpenCV 笔记1]

几个入门的简单程序,和对应的CMakeList, 虽然简单重新测一下写一下也是好的. CMake教程传送门 图像显示 ShowImage.cxx #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgcodecs/imgcodecs.hpp> int main(){ cv::Mat srcImage = cv::imread("1.jp

实例:图像载入、显示、混合与输出[OpenCV 笔记8]

是的是的,忍着尿意努力更新,就是为了更到wuli男神的部分,当然要把男神放在前面镇楼,欢迎下载配图,具体操作见code wuliEddie.jpg logo.png results.jpg LoadShowWriteImage.cxx #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> //#include <opencv2/imgcodecs/imgcodecs.hpp> //#in

基于opencv网络摄像头在ubuntu下的视频获取

 基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参考http://blog.csdn.net/xiabodan/article/details/23547847 3  测试代码 编译 g++ cameraCaptrue.cpp -o test `pkg-config --libs --cflags opencv` cameraCaptrue.cpp