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 //设置的位置值
);
用于在窗口上方显示文字条幅, 其函数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()即可.
即使你退出或者重启程序, 属性加载命令依然能够正常工作.
回调函数需要满足的定义:
void yourOpenGLCallback(
void* params //从cv::createOpenGLCallback()传过来的参数
);
可以通过cv::createOpenGLCallback()配置回调函数:
void cv::createOpenGLCallback(
const string& windowName, //窗口名称
cv::OpenGLCallback callback, //OpenGL的回调函数
void* params = NULL //传给回调函数的参数
);
参数可以在调用回调函数时给函数以额外的参数.