学习opencv_学习笔记三

本文详细介绍了OpenCV中的HighGUI模块,包括窗口管理、图像加载显示、鼠标事件处理、滑动条操作等内容,并通过示例代码展示了如何创建窗口、显示和操作图像、设置鼠标回调以及创建滑动条。此外,还简要提到了视频处理的基本操作,如读取视频帧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四章 细说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),//矩形坐标

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(800,600),

IPL_DEPTH_8U,

3

);

 

cvZero(image);

IplImage* temp = cvCloneImage(image);

 

//创建窗口

cvNamedWindow("Box Example");

 

//注册鼠标加调函数

cvSetMouseCallback(

"Box Example",

my_mouse_callback,

(void*) image

);

 

while (1)

{

cvCopy(image,temp);//复制图像

if (drawing_box) {

draw_box(temp,box);

}

cvShowImage("Box Example", temp);//显示图片

//esc退出

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) {

box.y += box.height;

box.height *= -1;

}

draw_box(image,box);

}

break;

default:

break;

}

}

 

Sliders  trackbars  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值