《Learning OpenCV3》——第九章 跨平台和本地窗口

第九章 跨平台和本地窗口

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值取自下表:

EventNumerical value
cv::EVENT_MOUSEMOVE0
cv::EVENT_LBUTTONDOWN1
cv::EVENT_RBUTTONDOWN2
cv::EVENT_MBUTTONDOWN3
cv::EVENT_LBUTTONUP4
cv::EVENT_RBUTTONUP5
cv::EVENT_MBUTTONUP6
cv::EVENT_LBUTTONDBLCLK7
cv::EVENT_RBUTTONDBLCLK8
cv::EVENT_MBUTTONDBLCLK9

flags为鼠标操作的详细信息,例如左键操作,右键操作等,详细见下表:

FlagNumerical value
cv::EVENT_FLAG_LBUTTON1
cv::EVENT_FLAG_RBUTTON2
cv::EVENT_FLAG_MBUTTON4
cv::EVENT_FLAG_CTRLKEY8
cv::EVENT_FLAG_SHIFTKEY16
cv::EVENT_FLAG_ALTKEY32

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等。此处不详细介绍。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页