OpenCV基础八:OpenCV在各操作系统平台上的使用(陆续更新)

八. 平台

鼠标

OpenCV通过回调函数使用鼠标,以下为定义回调函数必须匹配的协议:

void	your_mouse_callback(
	int	event,							//事件类型
	int	x,									//鼠标事件的X位置
	int y,									//y
	int flags,							//鼠标事件的更多细节
	void *param					//Parameters from cv::setMouseCallback()
);

第一个参数表:

事件 数值
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_MBUTTONDBCLK 9

第四个标志为鼠标事件标志, 用于鼠标组合键(如: shift+鼠标左键):

标志 数值
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

最后一个参数是void类型的指针, OpcnCV可以用来传递额外的信息到任何类型的结构.

需要一个函数来注册这个回调函数, 即cv::setMouseCallback(), 它需要三个参数:

void	cv::setMouseCallback(
	const	string&	windowName,					//应用回调函数的窗口
	cv::MouseCallback	on_mouse,			//要注册的回调函数
	void*	param = NULL								//回调函数的额外参数, 可以给回调函数传递信息
);

滑动条,滚动条和开关

HighGUI中创建一个滑动条的函数如下:

int	cv::creatTrackbar(
	const 	string&		trackbarname,			//滑动条名称
    cosnt	string&		windowName,			//窗口名称
    int*	value,													//滑动的条当前位置
    int		cout,														//滑动条总的数量
    cv::TrackbarCallback	onChange = NULL,	//回调函数(可选)	(当滑动按钮移动时, 回调函数自动调用)
    void*	param												//额外参数
);

这个回调函数并非必须的. 若无回调函数, 移动滑动钮的唯一响应就是value指向的变量值的变化(可以通过这个值来对值的变化做出响应)

回调函数所满足的形式:

void yourTrackbarCallback(
	int		pos,						//滑动条位置
    void*	param = NULL		//cv::setTrackbarCallback()的参数
);

c::creatTrackbar()的最后一个参数是params, 可以是一个任意类型的指针, 一旦回调执行, 这个参数可以传递给回调函数的params参数, 这样一来, 不创建全局变量也可以处理滑动条事件.

有两个函数可以用来获取和设置滑动条的位置值:

int	cv::getTrackbarPos(
	const	string&	trackbarName,			//滑动条名称
    const	string&	windowName				//窗口名称
);
void	cv::setTrackbarPos(
	const	string&	trackbarName,
    const 	string&	windowName,
    int pos															//设置的位置值
);

通过Qt后端工作

文字蒙版

用于在窗口上方显示文字条幅, 其函数API:

int	cv::displayOverlay(
	const	string&	name,					//显示的窗口名称
    const	string&	text,						//显示的文字
    int		delay										//显示的ms时间(0 = 'forever')
);

最后一个参数中, 若delay的值设置为0, 那么蒙版将一直存在或直到你再次调用cv::displayOverlay()覆盖原来的蒙版, 若在delay结束前调用cv::dispalyOverlay(), 则将显示新的蒙版, 且延时重置.

创建按钮

Qt接口提供创建按钮的函数, 包括正常的按钮, 单选按钮和复选框, 所有创建的按钮都位于控制面板上.

所有三种类型的按钮都通过一个方法完成:

int	cv::creatButton(
	const	string&	buttonName,									//按钮名称
    cv::ButtonCallback	onChange = NULL,			//按钮事件的回调函数(可无)
    void*	params,																//额外的按钮事件参数
    int	buttonType = cv::PUSH_BUTTON,				//按钮类型(PUSH_BUTTON or RADIOBOX or CHECKBOX)
    int	initalState = 0															//按钮的初始化状态
);

按钮回调函数定义:

void	yourButtonCallback(
	int		state,								//按钮状态
    void*	params						//cv::creatButton传递的参数
);

你传递给cv::creatButton()的params指针也会被传给回调函数的params参数.

buttonType可以取值为: cv::PUSH_BUTTON, cv::RADIOBOX或者cv::CHECKBOX:

第一个为标准按钮, 当你点击按钮便会调用回调函数

第二个为复选框, 按钮参数根据有没有选择复选框设置为1或者0

第三个为单选按钮, 区别在于点击按钮同时调用当前点击按钮的回调函数和当前没有被点击的按钮(互斥状态).

文本和文字

使用Qt接口写文本必须首先创建一个CvFont对象, 任何时候想在屏幕中添加文本都可以使用这个对象, 字体通过函数cv::fontQt()创建:

CvFont	fontQt(
	const	string&	fontName,								//字体名称
    int	pointSize,														//字体大小
    cv::Scalar	color = cv::Scalar::all(0),				//BGR颜色
    int	weight = cv::FONT_NORMAL,					//字体宽度(粗细), 1-100(Table	9-3)
    int	spacing = 0															//字体间距
);

Qt字体粗细的预定以名称及与其关联的值:

Camere capture constant 数值
cv::FONT_LIGHT 25
cv::FONT_NORMAL 50
cv::FONT_DEMIBOLD 63
cv::FONT_BOLD 75
cv::FONT_BLACK 87

最后一个参数spacing控制字符间距, 值正负都可以

放置文本函数:

void	cv::addText(
	cv::Mat&	image,				//要写入的图片
    const	string&	text,			//要写入的文本
    cv::Point	location,			//左下角定位的文本位置
    CvFont*	font						//OpenCV字体的结构体
);

文本的位置为首字符左下角的位置(文本基线的起点)

设置和获取窗口属性

大部分基于Qt后端创建的窗口状态属性都是可以获取的, 并且大部分都能够在创建窗口后更改:

void	cv::setWindowProperty(
	const	string&	name,						//窗口名称
    int	prop_id,										 //窗口属性ID
    double	prop_value							//设置的属性值
);
double	cv::getWindowProperty(
	const	string&	name,					//窗口名称
    int	prop_id											//窗口的属性ID
);

获取属性通过提供窗口名和属性ID(prop_id)就可以, 这是属性需要额外提供属性表:

属性名称 描述
cv::WIND_PROP_FULL_SIZE 设置为cv::WINDOW_FULLSCREEN可以将窗口显示为全屏
设置为cv::WINDOW_NORMAL窗口显示为正常尺寸
cv::WIND_PROP_AUTOSIZE 设置为cv::WINDOW_AUTOSIZE窗口大小自动调整为图像大小
设置为cv::WINDOW_NORMAL显示图像大小调整为窗口大小
cv::WIND_PROP_ASPECTRATIO 设置为cv::WINDOW_FREERATIO可以使窗口有任意长宽比(用户可调整)
设置为cv::WINDOW_KEEPRATIO只能按照固定长宽比调整窗口大小

保存和恢复窗口的状态

Qt接口可以保存和恢复窗口的状态:

void	cv::savaWindowParameters(
	const	string&	name											//窗口名
);
void	cv::loadWindowParameters(
	const	string&	name
);

保存窗口时使用cv::saveWindowParameters即可, 恢复窗口通过cv::loadWIndowParameters()即可.

即使你退出或者重启程序, 属性加载命令依然能够正常工作.

和OpenGL交互

回调函数需要满足的定义:

void	yourOpenGLCallback(
	void*	params											//从cv::createOpenGLCallback()传过来的参数
);

可以通过cv::createOpenGLCallback()配置回调函数:

void	cv::createOpenGLCallback(
	const	string&	windowName,					//窗口名称
    cv::OpenGLCallback	callback,				//OpenGL的回调函数
    void*	params = NULL								//传给回调函数的参数
);

参数可以在调用回调函数时给函数以额外的参数.

你可能感兴趣的:(#,OpenCV,opencv,计算机视觉,c++)