《OpenCV图像处理》——1.7 用户交互工具
本節書摘來自華章計算機《OpenCV圖像處理》一書中的第1章,第1.7節,作者:[西]葛羅瑞亞·布埃諾·加西亞(Gloria Bueno García)著,更多章節內容可以訪問云棲社區“華章計算機”公眾號查看
1.7 用戶交互工具
前面幾節介紹了如何創建窗口(namedWindow)來顯示(imshow)一幅圖像和提取/處理事件(waitKey)。我們提供的示例展示了一種通過鍵盤使用OpenCV應用進行用戶交互的簡單方法。waitKey函數在超時之前會返回一個按鍵
編碼。
幸運的是,OpenCV為用戶交互提供了更為靈活的方式,例如,滑動條和鼠標交互,它們可以和某些繪圖功能結合提供豐富的用戶體驗。而且,如果使用Qt支持(CMake的WITH_QT選項)對OpenCV進行本地編譯,那么一組新函數可用來編寫一個更好的用戶界面(UI)。
本節給出一個快速綜述來說明,在使用Qt支持的一個OpenCV項目中,編寫用戶界面的可用功能。下面使用一個名為showUI的示例,在OpenCV界面支持下對上述綜述進行說明。
該示例展示了一個窗口中的一幅彩色圖片,說明如何使用某些基本元素來豐富用戶交互。圖1-6顯示了在該示例中創建的UI元素:
showUI示例(沒有回調函數)的源代碼如下:
當使用Qt支持建立OpenCV時,每個所創建的窗口(通過highgui模塊)顯示了一個默認工具欄(見圖1-6),帶有平移、縮放、保存和打開屬性窗口的選項(從左到右)。
除了上述提到的工具欄(僅在Qt上可用),下面幾節將說明在該示例中創建的各種UI元素和實現這些UI元素的代碼。
1.7.1 滑動條
在指定的窗口(winname)中,使用createTrackbar(const String& trackbarname, const String& winname, int value, int count, TrackbarCallback onChange=0, void userdata=0)函數創建滑動條,該函數使用了一個鏈接整數值(value)、一個最大值(count)、一個當滑動條改變時被調用的可選回調函數(onChange)和回調函數的一個參數(userdata)。回調函數本身得到兩個參數:值(通過滑動條選取)和一個指向userdata(可選)的指針。對于Qt支持,如果沒有指定窗口,那么會在屬性窗口中創建該滑動條。在showUI示例中,創建了兩個滑動條:第一個在主窗口中,第二個在屬性窗口中?;瑒訔l回調的代碼是:
1.7.2 鼠標交互
總是生成鼠標事件使得用戶可以用鼠標(移動和點擊)進行交互。通過設置正確的處理程序或回調函數,可以實現諸如選擇、拖放之類的動作。在指定的窗口(winname)和可選參數(userdata)下使用setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata=0)函數可啟用該回調函數(onMouse)。
處理鼠標事件的回調函數的源代碼是:
在showUI示例中,通過一個回調函數(cbMouse),可用鼠標事件繪制一個矩形來選擇一個矩形區域。在這個示例中,該函數的聲明為void cbMouse(int event, int x, int y, int f?lags, void*),其參數為事件發生點(x, y)的位置、事件發生(f?lags)時的條件和可選項userdata。
可以在highgui.hpp頭文件中找到可用的事件、標志以及它們對應的定義符號。
1.7.3 按鈕
OpenCV(只在使用Qt支持時)允許創建三種類型的按鈕:復選框(QT_CHECKBOX)、單選框(QT_RADIOBOX)和按鈕(QT_PUSH_BUTTON)??梢苑謩e使用這些類型的按鈕來設置選項、設置互斥選項和按鈕上的執行動作。在屬性窗口中,這三個按鈕可使用函數createButton(const String& button_name, ButtonCallback on_change, void* userdata=0, int type=QT_PUSH_BUTTON, bool init_state=false)來創建,它被安排在這個窗口所創建的最后一個滑動條之后的一個按鈕條中。該按鈕的參數是它的名字(button_name)、狀態變化(on_change)時調用的回調函數、該回調函數的一個可選參數(userdate)、按鈕的類型(type)和該按鈕的初始狀態(init_state)。
接下來,展示本示例中按鈕所對應的回調函數的源代碼:
一個按鈕的回調函數得到兩個參數:它的狀態和一個指向用戶數據的(可選項)指針。在showUI示例中,展示了如何將一個整數(radioboxCallBack(int state, void id))傳遞到指定的按鈕和一個更復雜的對象(pushbuttonCallBack(int, void font))。
1.7.4 文本繪制與顯示
實現圖像處理結果與用戶間通信的一種非常有效的方式是在被處理的圖片上繪制形狀或顯示文本。通過imgproc模塊,OpenCV提供了一些方便的功能來實現諸如輸入文本、繪制線、圓、橢圓、矩形、多邊形等之類的任務。showUI示例說明了如何在一幅圖像上選擇一個矩形區域和繪制一個矩形來標記所選擇的區域。下面的函數繪制(img)一個矩形,該矩形通過在一幅圖像上的兩個點(p1,p2)定義,并具有指定的顏色和其他可選參數,如線條的寬度(對于填充形狀是負數)和類型:
除了支持形狀繪制之外,imgproc模塊提供一個功能,使用下面的函數在一幅圖像上放置文本:
在core.hpp頭文件中,可以為文本檢查可用的字體。
在highgui模塊中,Qt支持還增加了一些附加方法用于在一個OpenCV應用的主窗口上顯示文本:
圖像上的文本:使用函數addText(const Mat& img, const String& text, Point org, const QtFont& font)得到這個結果。這個函數允許選擇所顯示文本的起點,該文本使用了之前用的函數fontQt(const String& nameFont, int pointSize=-1, Scalar color=Scalar::all(0), int weight=QT_FONT_NORMAL, int style=QT_STYLE_NORMAL, int spacing=0)創建的字體。在showUI示例中,當點擊按鈕時(通過在回調函數內調用addText函數)這個函數用于在圖像上輸入文本。
狀態欄上的文本:使用函數displayStatusBar(const String& winname, const String& text, int delayms=0)顯示狀態欄中的文本,由最后一個參數(delayms)指定顯示的毫秒數。在showUI示例中,當屬性窗口的按鈕和滑動條更改其狀態時,使用該函數(在回調函數中)顯示一條文本信息。
覆蓋在圖像上的文本:使用函數displayOverlay(const String& winname, const String& text, int delayms=0)顯示覆蓋在圖像上的文本,由最后一個參數指定顯示的毫秒數。在showUI示例中,當主窗口滑動條更改其值時,使用該函數(在回調函數中)顯示文本信息。
總結
以上是生活随笔為你收集整理的《OpenCV图像处理》——1.7 用户交互工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Windows PowerShell实
- 下一篇: 《Android传感器开发与智能设备案例