【opencv學習筆記四】opencv3.4.0圖形用戶介面highgui函數解析
在筆記二中我們已經知道了,在highgui文件夾下的正是opencv圖形用戶介面功能結構,我們這篇博客所說的便是D:Program
Filesopencv340opencvuildincludeopencv2highguihighgui.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::namedWindowenum 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::getWindowPropertyenum 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::MouseCallbackenum 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::MouseCallbackenum 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 weightenum 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 styleenum QtFontStyles { QT_STYLE_NORMAL = 0, //!< Normal font. QT_STYLE_ITALIC = 1, //!< Italic font. QT_STYLE_OBLIQUE = 2 //!< Oblique font. };
7、按鈕
//! Qt "button" typeenum 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);
用戶返回數據。
【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
按鈕初始值。
推薦閱讀:
※做增強現實AR,高通sdk與opencv有什麼區別。各有什麼利弊?
※OpenCV 與 OpenGL 的關係是什麼?
※1.25【OpenCV圖像處理】直方圖反向投影
※關於MFC是否out了的問題?
TAG:OpenCV |