第九章 跨平台和本地窗口
OpenCV3支持本地窗口操作,也支持一些跨平台的窗口操作,例如Qt等。虽然OpenCV3也集成了Qt的部分GUI功能,但总体来说效果并不十分强大;推荐的操作方法是直接Qt环境搭建OpenCV3开发。
一:HighGUI本地窗口操作
1.1 窗口创建、销毁
int cv::namedWindow(
const string& name,
int flags = 0
);
flags主要有两种取值:0值——用户可以调整窗口大小;cv::WINDOW_AUTOSIZE——窗口自动调整,包含所有窗口内容。
销毁窗口使用:
int cv::destroyWindow(
const string& name, // Handle used to identify window
);
1.2 显示图像
在名称为name的窗口中显示图像:
void cv::imshow(
const string& name, // Handle used to identify window
cv::InputArray image // Image to display in window
);
1.3 更新窗口
之前介绍过,使用cv::waitKey可以等待按键输入:
int cv::waitKey(
int delay = 0 // Milliseconds until giving up (0='never')
);
等待相应的毫秒数,如果没有按键被按下则返回-1,否则返回相应的按键值。cv::WaitKey还有隐含的功能——更新窗口。因此,很多没有调用它的时候图像往往不能够正常显示。
1.4 其他功能
一些常用的或平台相关的功能:
void cv::moveWindow( const char* name, int x, int y );
void cv::destroyAllWindows( void );
int cv::startWindowThread( void );
1.5 鼠标事件
OpenCV3的鼠标事件通过回调函数实现,回调的形式如:
void your_mouse_callback(
int event, // Event type (see Table 9-1)
int x, // x-location of mouse event
int y, // y-location of mouse event
int flags, // More details on event (see Table 9-1)
void* param // Parameters from cv::setMouseCallback()
);
其中,event值取自下表:
Event | Numerical value |
---|---|
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 |
flags为鼠标操作的详细信息,例如左键操作,右键操作等,详细见下表:
Flag | Numerical value |
---|---|
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 |
param为设置回调函数时传递的额外参数。很多c语言的回调函数都会保留这种传递,当使用c++进行类封装时可以传递this类指针,方便在回调函数内部调用。
设置鼠标事件回调:
void cv::setMouseCallback(
const string& windowName, // Handle used to identify window
cv::MouseCallback on_mouse, // Callback function
void* param = NULL // Additional parameters for callback fn.
);
1.6 Sliders、trackbars和switches
Sliders在前面介绍过,当给Slider赋二值时它也可以作为开关使用。具体的操作接口:
// 创建
int cv::createTrackbar(
const string& trackbarName, // Handle used to identify trackbar
const string& windowName, // Handle used to identify window
int* value, // Slider position gets put here
int count, // Total counts for slider at far right
cv::TrackbarCallback onChange = NULL,// Callback function (optional)
void* param = NULL // Additional params for callback fn.
);
// 回调
void your_trackbar_callback(
int pos, // Trackbar slider position
void* param = NULL // Parameters from cv::setTrackbarCallback()
);
// 获取、设置坐标
int cv::getTrackbarPos(
const string& trackbarName, // Handle used to identify trackbar, label
const string& windowName, // Handle used to identify window
);
void cv::setTrackbarPos(
const string& trackbarName, // Handle used to identify trackbar, label
const string& windowName, // Handle used to identify window
int pos // Trackbar slider position
);
二:Qt Backend
OpenCV3中集成了Qt的部分GUI功能,可以使用这些功能完成更加复杂的窗口。此处不详细介绍。
三:OpenCV3和GUI工具
虽然集成了Qt的部分功能,但对于需求更高的GUI建议使用单独的GUI库,例如Qt、WTF等。此处不详细介绍。