第四章 细说HighGUI
一个可移植的图形工具包
由以下三部分组成:
硬件部分
文件部分
图形用户界面
1创建窗口
所用到函数:
/* create window 创建窗口*/
CVAPI(int) cvNamedWindow( const char* name, //窗口名称
int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) );//根据图像自动调整大小
/* destroy window and all the trackers associated with it 销毁窗口 */
CVAPI(void) cvDestroyWindow( const char* name );//窗口名称
/* get native window handle (HWND in case of Win32 and Widget in case of X Window) */
//窗口系统,windows下返回HWND
CVAPI(void*) cvGetWindowHandle( const char* name );
/* get name of highgui window given its native handle 取得窗口名称*/
CVAPI(const char*) cvGetWindowName( void* window_handle );
/* resize/move window 调整窗口大小*/
CVAPI(void) cvResizeWindow( const char* name, int width, int height );
//移动窗口 ,xy为左上角坐标
CVAPI(void) cvMoveWindow( const char* name, int x, int y );
示例代码如下:
#include <opencv2\opencv.hpp>
using namespace cv;
int main(int argc,char** argv) {
//创建窗口
cvNamedWindow("test");
//调整窗口大小
cvResizeWindow("test",800,600);
//移动窗口
cvMoveWindow("test", 80, 80);
//等待用户按键
cvWaitKey();
//释放窗口
cvDestroyWindow("test");
}
2载入图像
所用到函数
//载入图像
CVAPI(IplImage*) cvLoadImage( const char* filename, // 文件名
int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));//
Iscolor的常量值
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-1,
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =0, //单通道
/* ?, color */
CV_LOAD_IMAGE_COLOR =1, //三通道
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =2,//非8位图像
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =4 //原始通道读入
//保存图像
/* save image to file */
CVAPI(int) cvSaveImage( const char* filename, //文件名
const CvArr* image, //图像数组,
const int* params CV_DEFAULT(0) );
3显示图像
/* display image within window (highgui windows remember their content) */
CVAPI(void) cvShowImage( const char* name, //窗口名称
const CvArr* image );//图像 IplImage*
//关闭所有窗口,释放内存
CVAPI(void) cvDestroyAllWindows(void);
//创建线程,处理窗口更新
CVAPI(int) cvStartWindowThread( void );
//等待用户按键,为0时无限等待
/* wait for key event infinitely (delay<=0) or for "delay" milliseconds */
CVAPI(int) cvWaitKey(int delay CV_DEFAULT(0));
示例代码如下:
鼠标事件
//回调函数的格式
typedef void (CV_CDECL *CvMouseCallback )(int event, //事件类型
int x, //事件发生时鼠标位置
int y,
int flags, //事件发生时的不同状态
void* param); //额外参数
Event的取值:
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,
CV_EVENT_MOUSEWHEEL =10,
CV_EVENT_MOUSEHWHEEL =11
Flag的取值
CV_EVENT_FLAG_LBUTTON =1,
CV_EVENT_FLAG_RBUTTON =2,
CV_EVENT_FLAG_MBUTTON =4,
CV_EVENT_FLAG_CTRLKEY =8,
CV_EVENT_FLAG_SHIFTKEY =16,
CV_EVENT_FLAG_ALTKEY =32
//注册回调函数
/* assign callback for mouse events */
CVAPI(void) cvSetMouseCallback( const char* window_name, //窗体名称
CvMouseCallback on_mouse,//回调函数
void* param CV_DEFAULT(NULL));//额外信息
示例代码:
#include <opencv2\opencv.hpp>
using namespace cv;
//鼠标在窗口中画方形的程序
//函数声明
void my_mouse_callback(int event, int x,int y,int flags,void* param);
//矩形
CvRect box;
//绘制状态
bool drawing_box = false;
//绘制矩形
void draw_box(IplImage* img, CvRect rect) {
cvRectangle(
img,//目标图像
cvPoint(box.x, box.y),