1. 程式人生 > >【opencv學習筆記四】opencv3.4.0圖形使用者介面highgui函式解析

【opencv學習筆記四】opencv3.4.0圖形使用者介面highgui函式解析

在筆記二中我們已經知道了,在highgui資料夾下的正是opencv圖形使用者介面功能結構,我們這篇部落格所說的便是D:\Program Files\opencv340\opencv\build\include\opencv2\highgui\highgui.hpp中的函數了。

目錄

【namedWindow】

【destroyWindow】

【destroyAllWindows】

【startWindowThread】

【waitKeyEx】

【waitKey】

【imshow】

【resizeWindow】

【resizeWindow】

【moveWindow】

【setWindowProperty】

【setWindowTitle】

【getWindowProperty】

【setMouseCallback】

【getMouseWheelDelta】

【selectROI】

【selectROIs】

【createTrackbar】

【getTrackbarPos】

【setTrackbarPos】

【setTrackbarMax】

【setTrackbarMin】

【setOpenGlDrawCallback】

【setOpenGlContext】

【updateWindow】

【QtFont】

【addText】

【displayOverlay】

【displayStatusBar】

【saveWindowParameters】

【loadWindowParameters】

【createButton】


詳細說明

在講函式之前,我們先看一下即將用到的幾種列舉型別和回撥函式。首先是列舉型別:

1、視窗標誌:

//! Flags for cv::namedWindow
enum WindowFlags {
       WINDOW_NORMAL     = 0x00000000, //!< 使用者可自由調整大小
       WINDOW_AUTOSIZE   = 0x00000001, //!< 視窗尺寸由影象決定,使用者不可調節
       WINDOW_OPENGL     = 0x00001000, //!< opengl支援的視窗

       WINDOW_FULLSCREEN = 1,          //!< 全屏
       WINDOW_FREERATIO  = 0x00000100, //!< 最大化,不受圖片縱橫比影響
       WINDOW_KEEPRATIO  = 0x00000000, //!< 保持影象縱橫比不變
       WINDOW_GUI_EXPANDED=0x00000000, //!< 狀態條與工具條
       WINDOW_GUI_NORMAL = 0x00000010, //!< old fashious way
    };

2、視窗屬性:
//! Flags for cv::setWindowProperty / cv::getWindowProperty
enum WindowPropertyFlags {
       WND_PROP_FULLSCREEN   = 0, //!< 全屏(can be WINDOW_NORMAL or WINDOW_FULLSCREEN).
       WND_PROP_AUTOSIZE     = 1, //!<自動大小(can be WINDOW_NORMAL or WINDOW_AUTOSIZE).
       WND_PROP_ASPECT_RATIO = 2, //!< 保持縱橫比(can be set to WINDOW_FREERATIO or WINDOW_KEEPRATIO).
       WND_PROP_OPENGL       = 3, //!< opengl視窗.
       WND_PROP_VISIBLE      = 4  //!< 檢測視窗是否存在並且是否可見
     };

3、滑鼠事件
//! Mouse Events see cv::MouseCallback
enum MouseEventTypes {
       EVENT_MOUSEMOVE      = 0, //!< 滑鼠在視窗上移動
       EVENT_LBUTTONDOWN    = 1, //!< 滑鼠左鍵按下
       EVENT_RBUTTONDOWN    = 2, //!< 滑鼠右鍵按下
       EVENT_MBUTTONDOWN    = 3, //!< 滑鼠中鍵按下
       EVENT_LBUTTONUP      = 4, //!< 滑鼠左鍵鬆開
       EVENT_RBUTTONUP      = 5, //!< 滑鼠右鍵鬆開
       EVENT_MBUTTONUP      = 6, //!< 滑鼠中鍵鬆開
       EVENT_LBUTTONDBLCLK  = 7, //!< 滑鼠左鍵雙擊
       EVENT_RBUTTONDBLCLK  = 8, //!< 滑鼠右鍵雙擊
       EVENT_MBUTTONDBLCLK  = 9, //!< 滑鼠中鍵雙擊
       EVENT_MOUSEWHEEL     = 10,//!< 正值與負值分別表示滑鼠向前與向後滾動
       EVENT_MOUSEHWHEEL    = 11 //!< 正值與負值分別表示滑鼠向左與向右滾動
     };

4、滑鼠事件
//! Mouse Event Flags see cv::MouseCallback
enum MouseEventFlags {
       EVENT_FLAG_LBUTTON   = 1, //!< 滑鼠左鍵按下
       EVENT_FLAG_RBUTTON   = 2, //!< 滑鼠右鍵按下
       EVENT_FLAG_MBUTTON   = 4, //!< 滑鼠中鍵按下
       EVENT_FLAG_CTRLKEY   = 8, //!< CTRL鍵按下
       EVENT_FLAG_SHIFTKEY  = 16,//!< SHIFT鍵按下
       EVENT_FLAG_ALTKEY    = 32 //!< ALT鍵按下
     };

5、字型粗細
//! Qt font weight
enum QtFontWeights {
        QT_FONT_LIGHT           = 25, //!< 字型粗細25
        QT_FONT_NORMAL          = 50, //!< 字型粗細50
        QT_FONT_DEMIBOLD        = 63, //!< 字型粗細63
        QT_FONT_BOLD            = 75, //!< 字型粗細75
        QT_FONT_BLACK           = 87  //!< 字型粗細87
     };

6、字型風格

//! Qt font style
enum QtFontStyles {
        QT_STYLE_NORMAL         = 0, //!< Normal font.
        QT_STYLE_ITALIC         = 1, //!< Italic font.
        QT_STYLE_OBLIQUE        = 2  //!< Oblique font.
     };

7、按鈕
//! Qt "button" type
enum QtButtonTypes {
       QT_PUSH_BUTTON   = 0,    //!< 按鈕
       QT_CHECKBOX      = 1,    //!< 複選框
       QT_RADIOBOX      = 2,    //!< 單選框
       QT_NEW_BUTTONBAR = 1024  //!< Button should create a new buttonbar
     };

下面看看四種回撥函式:

1、滑鼠事件回撥函式,用於函式setMouseCallback

typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);

int event

事件型別,值可以是MouseEventTypes常數:

  •        EVENT_MOUSEMOVE      = 0, //!< 滑鼠在視窗上移動
  •        EVENT_LBUTTONDOWN    = 1, //!< 滑鼠左鍵按下
  •        EVENT_RBUTTONDOWN    = 2, //!< 滑鼠右鍵按下
  •        EVENT_MBUTTONDOWN    = 3, //!< 滑鼠中鍵按下
  •        EVENT_LBUTTONUP      = 4, //!< 滑鼠左鍵鬆開
  •        EVENT_RBUTTONUP      = 5, //!< 滑鼠右鍵鬆開
  •        EVENT_MBUTTONUP      = 6, //!< 滑鼠中鍵鬆開
  •        EVENT_LBUTTONDBLCLK  = 7, //!< 滑鼠左鍵雙擊
  •        EVENT_RBUTTONDBLCLK  = 8, //!< 滑鼠右鍵雙擊
  •        EVENT_MBUTTONDBLCLK  = 9, //!< 滑鼠中鍵雙擊
  •        EVENT_MOUSEWHEEL     = 10,//!< 正值與負值分別表示滑鼠向前與向後滾動
  •        EVENT_MOUSEHWHEEL    = 11 //!< 正值與負值分別表示滑鼠向左與向右滾動

int x

X軸座標。

int y

Y軸座標。

int flags

事件標誌,值為MouseEventFlags常量:

  •        EVENT_FLAG_LBUTTON   = 1, //!< 滑鼠左鍵按下
  •        EVENT_FLAG_RBUTTON   = 2, //!< 滑鼠右鍵按下
  •        EVENT_FLAG_MBUTTON   = 4, //!< 滑鼠中鍵按下
  •        EVENT_FLAG_CTRLKEY   = 8, //!< CTRL鍵按下
  •        EVENT_FLAG_SHIFTKEY  = 16,//!< SHIFT鍵按下
  •        EVENT_FLAG_ALTKEY    = 32 //!< ALT鍵按下

void* userdata

使用者返回引數,[可選]


2、軌跡條事件回撥函式,用於函式createTrackbar

typedef void (*TrackbarCallback)(int pos, void* userdata);

int pos

軌跡條當前位置

void* userdata

使用者返回引數,[可選]


3、回撥函式,用於函式setOpenGlDrawCallback

typedef void (*OpenGlDrawCallback)(void* userdata);

void* userdata

使用者返回引數,[可選]


4、按鈕事件回撥函式,用於函式createButton

typedef void (*ButtonCallback)(int state, void* userdata);
int state

當前按鈕狀態,按鈕-1,複選框與單選框為0或1。

void* userdata

使用者返回引數,[可選]

下面開始說明各個函式的功能。

【namedWindow】

void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);

該函式建立一個視窗,並且視窗名稱為該視窗的唯一標識,如果要建立的視窗名稱已經存在,則該函式什麼也不做。

視窗可以通過destroyWindow與destroyAllWindows銷燬。

const String& winname

視窗名稱。

int flags

視窗標誌。使用WindowFlags常量:

  •        WINDOW_NORMAL     = 0x00000000, //!< 使用者可自由調整大小
  •        WINDOW_AUTOSIZE   = 0x00000001, //!< 視窗尺寸由影象決定,使用者不可調節
  •        WINDOW_OPENGL     = 0x00001000, //!< opengl支援的視窗
  •        WINDOW_FULLSCREEN = 1,          //!< 全屏
  •        WINDOW_FREERATIO  = 0x00000100, //!< 最大化,不受圖片縱橫比影響
  •        WINDOW_KEEPRATIO  = 0x00000000, //!< 保持影象縱橫比不變
  •        WINDOW_GUI_EXPANDED=0x00000000, //!< 狀態條與工具條
  •        WINDOW_GUI_NORMAL = 0x00000010, //!< old fashious way

【destroyWindow】

void destroyWindow(const String& winname);
銷燬由const String& winname指定名稱的視窗。

【destroyAllWindows】

void destroyAllWindows();
銷燬所有視窗。

【startWindowThread】

int startWindowThread();
開始視窗執行緒。

【waitKey】【waitKeyEx】

int waitKey(int delay = 0);
int waitKeyEx(int delay = 0);
等待按鍵按下,並返回按鍵值。waitKeyEx返回的是完整的按鍵值。

int delay為等待時間。

【imshow】

void imshow(const String& winname, InputArray mat);
在指定的視窗上顯示影象。

const String& winname

視窗名稱。

InputArray mat

要顯示的影象。

【resizeWindow】

void resizeWindow(const String& winname, int width, int height);
void resizeWindow(const String& winname, const cv::Size& size);
調整視窗大小。

const String& winname

視窗名稱。

int width

新寬度。

int height

新高度。

const cv::Size& size

新視窗大小。

【moveWindow】

void moveWindow(const String& winname, int x, int y);
視窗移動。

const String& winname

視窗名稱。

int x

移動後坐標x

int y

移動後坐標y

【setWindowProperty】

void setWindowProperty(const String& winname, int prop_id, double prop_value);
設定視窗屬性。

const String& winname

視窗名稱。

int prop_id

要更改的視窗化屬性。其值可以為WindowPropertyFlags常量:

  •        WND_PROP_FULLSCREEN   = 0, //!< 全屏(can be WINDOW_NORMAL or WINDOW_FULLSCREEN).
  •        WND_PROP_AUTOSIZE     = 1, //!<自動大小(can be WINDOW_NORMAL or WINDOW_AUTOSIZE).
  •        WND_PROP_ASPECT_RATIO = 2, //!< 保持縱橫比(can be set to WINDOW_FREERATIO or WINDOW_KEEPRATIO).
  •        WND_PROP_OPENGL       = 3, //!< opengl視窗.
  •        WND_PROP_VISIBLE      = 4  //!< 檢測視窗是否存在並且是否可見

double prop_value

新視窗屬性值。其值可以為WindowFlags常量:

  •        WINDOW_NORMAL     = 0x00000000, //!< 使用者可自由調整大小
  •        WINDOW_AUTOSIZE   = 0x00000001, //!< 視窗尺寸由影象決定,使用者不可調節
  •        WINDOW_OPENGL     = 0x00001000, //!< opengl支援的視窗
  •        WINDOW_FULLSCREEN = 1,          //!< 全屏
  •        WINDOW_FREERATIO  = 0x00000100, //!< 最大化,不受圖片縱橫比影響
  •        WINDOW_KEEPRATIO  = 0x00000000, //!< 保持影象縱橫比不變
  •        WINDOW_GUI_EXPANDED=0x00000000, //!< 狀態條與工具條
  •        WINDOW_GUI_NORMAL = 0x00000010, //!< old fashious way

【setWindowTitle】

void setWindowTitle(const String& winname, const String& title);
更新視窗標題。

【getWindowProperty】

double getWindowProperty(const String& winname, int prop_id);
獲取視窗屬性。

const String& winname

視窗名稱。

int prop_id

要獲取的視窗屬性。其值可以為WindowPropertyFlags常量:

  •        WND_PROP_FULLSCREEN   = 0, //!< 全屏(can be WINDOW_NORMAL or WINDOW_FULLSCREEN).
  •        WND_PROP_AUTOSIZE     = 1, //!<自動大小(can be WINDOW_NORMAL or WINDOW_AUTOSIZE).
  •        WND_PROP_ASPECT_RATIO = 2, //!< 保持縱橫比(can be set to WINDOW_FREERATIO or WINDOW_KEEPRATIO).
  •        WND_PROP_OPENGL       = 3, //!< opengl視窗.
  •        WND_PROP_VISIBLE      = 4  //!< 檢測視窗是否存在並且是否可見

【setMouseCallback】

void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
對指定視窗設定滑鼠處理函式。

const String& winname

視窗名稱。

MouseCallback onMouse

滑鼠回撥函式。

回撥函式定義

typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);

void* userdata

使用者返回資料。

【getMouseWheelDelta】

int getMouseWheelDelta(int flags);

在處理滑鼠滾輪事件EVENT_MOUSEWHEEL與EVENT_MOUSEHWHEEL時,返回滑鼠的運動增量。對於普通滑鼠而言,這個值通常為120的倍數。


int flags

滑鼠返回標誌。

【selectROI】

Rect selectROI(const String& windowName, InputArray img, bool showCrosshair = true, bool fromCenter = false);
Rect selectROI(InputArray img, bool showCrosshair = true, bool fromCenter = false);

在給定的影象上選擇一個ROI區域。該函式建立一個視窗並且允許使用者通過滑鼠選擇一個ROI區域,通過空格鍵或Enter鍵結束選擇,通過C鍵取消選擇,取消選擇後返回一個空的矩形框。


const String& windowName

顯示操作過程的視窗名稱。

InputArray img

影象。

bool showCrosshair

值為ture時,將顯示矩形框的十字線。

bool fromCenter

值為ture時,滑鼠初始點作為矩形框的中點;值為false時,滑鼠初始點為矩形的一個拐角。

【selectROIs】

void selectROIs(const String& windowName, InputArray img,
                             CV_OUT std::vector<Rect>& boundingBoxes, bool showCrosshair = true, bool fromCenter = false);
選擇多個矩形框,與selectROI類似。

【createTrackbar】

int createTrackbar(
    const String& trackbarname, 
    const String& winname,                          
    int* value, 
    int count,                           
    TrackbarCallback onChange = 0,                            
    void* userdata = 0    );
建立軌跡條。

const String& trackbarname

軌跡條名稱。

const String& winname

顯示軌跡條的視窗名稱。

               
int* value

軌跡條的當前值。

int count

軌跡條的最大值,最小值總為0。

TrackbarCallback onChange    

軌跡條回撥函式。

typedef void (*TrackbarCallback)(int pos, void* userdata);

               
void* userdata

使用者返回資料。

【getTrackbarPos】

int getTrackbarPos(const String& trackbarname, const String& winname);

獲取軌跡條當前位置。

const String& trackbarname

軌跡條名稱。

const String& winname

視窗名稱。

【setTrackbarPos】

void setTrackbarPos(const String& trackbarname, const String& winname, int pos);
設定軌跡條當前位置。

const String& trackbarname

軌跡條名稱。

const String& winname

視窗名稱。

int pos

軌跡條位置。

【setTrackbarMax】

void setTrackbarMax(const String& trackbarname, const String& winname, int maxval);
設定軌跡條最大值。

const String& trackbarname

軌跡條名稱。

const String& winname

視窗名稱。

int maxval

軌跡條最大值。

【setTrackbarMin】

void setTrackbarMin(const String& trackbarname, const String& winname, int minval);
設定軌跡條最小值。

const String& trackbarname

軌跡條名稱。

const String& winname

視窗名稱。

int minval

軌跡條最小值。

【setOpenGlDrawCallback】

void setOpenGlDrawCallback(const String& winname, OpenGlDrawCallback onOpenGlDraw, void* userdata = 0);
呼叫回撥函式,在影象最上層繪畫。

const String& winname

視窗名稱。

OpenGlDrawCallback onOpenGlDraw

回撥函式。

typedef void (*OpenGlDrawCallback)(void* userdata);

void* userdata

使用者返回資料。

【setOpenGlContext】

void setOpenGlContext(const String& winname);
將制定視窗設定為openGL的關聯視窗。

【updateWindow】

void updateWindow(const String& winname);
強制視窗重新呼叫setOpenGlContext。

【QtFont】

struct QtFont
{
    const char* nameFont;  //!< 字型名稱
    Scalar      color;     //!< 字型顏色
    int         font_face; //!< 字型風格
    const int*  ascii;     //!< 字型粗細
    const int*  greek;
    const int*  cyrillic;
    float       hscale, vscale;
    float       shear;     //!< slope coefficient: 0 - normal, >0 - italic
    int         thickness; //!< See cv::QtFontWeights
    float       dx;        //!< horizontal interval between letters
    int         line_type; //!< PointSize
};
字型格式。

【addText】

void addText( const Mat& img, const String& text, Point org, const QtFont& font);
在指定影象上新增文字。

【displayOverlay】

void displayOverlay(const String& winname, const String& text, int delayms = 0);
顯示影象overlay文字。

【displayStatusBar】

void displayStatusBar(const String& winname, const String& text, int delayms = 0);
顯示狀態列文字。

【saveWindowParameters】

void saveWindowParameters(const String& windowName);
儲存指定視窗的引數。

【loadWindowParameters】

void loadWindowParameters(const String& windowName);
載入指定視窗的引數。【createButton】
int createButton( 
	const String& bar_name, 
	ButtonCallback on_change,                         
	void* userdata = 0, 
	int type = QT_PUSH_BUTTON,                           
	bool initial_button_state = false	);
建立按鈕。

const String& bar_name

用於建立按鈕的視窗名稱。

ButtonCallback on_change

按鈕回撥函式。

typedef void (*ButtonCallback)(int state, void* userdata);

void* userdata

使用者返回資料。

int type

按鈕型別。

bool initial_button_state

按鈕初始值。