opencv類比button,opencvbutton
簡介
在opencv中並沒有專門的button控制項,一般可以使用trackbar,設定狀態為0、1,來類比控制觸發。不過總感覺這方法有點二,因此嘗試了下在opencv中類比鍵值使用。 同時在實現過程中,使用到了資料:http://www.csdn123.com/html/mycsdn20140110/84/8403a669ceed8e896d5c3ebc45b483b4.html ,非常感謝。
實現流程
具體代碼
void ButtonShow(void){int i; for(i=0; i< buttonNum; i++){if(i != 0){L_width = buttonAddr[i-1][2] + 30;}b_seat1=drawButton(img, buttonName[i],Point(L_width, L_height),0);buttonAddr[i] = (int *)malloc(4); buttonAddr[i][0] = b_seat1.x;buttonAddr[i][1] = b_seat1.y;buttonAddr[i][2] = b_seat1.width + b_seat1.x;buttonAddr[i][3] = b_seat1.height+ b_seat1.y;}} void on_mouse( int event, int x, int y, int flags, void* ustc) {int buttonNow = -3;if(event == CV_EVENT_LBUTTONDOWN){tmpAddr[0] = x;tmpAddr[1] = y;tmpAddr[2] = 0;tmpAddr[3] = 0;}else if(event == CV_EVENT_LBUTTONUP){tmpAddr[2] = x;tmpAddr[3] = y;buttonNow = choiceButton(tmpAddr, buttonAddr, buttonNum);on_button(buttonNow);}} int main(int argc,char **argv){img=imread(back_name,1); ButtonShow();imshow(back_show, img);cvSetMouseCallback(back_show, on_mouse, NULL);waitKey();}
主體架構
首先載入一副圖片作為背景圖,接著將使用ButtonShow將button畫在背景圖片上,同時將每個button的座標位置都儲存在buttonAddr數組中,接著將畫好button之後的背景圖片顯示出來,最後給該背景圖加上滑鼠響應和等待使用者操作。
img=imread(back_name,1); ButtonShow();imshow(back_show, img);cvSetMouseCallback(back_show, on_mouse, NULL);waitKey();
滑鼠響應
將使用者滑鼠左鍵按下和抬起的座標都儲存在tmpAddr,接著使用函數choiceButton和on_button進行控制項的選擇和響應。
void on_mouse( int event, int x, int y, int flags, void* ustc){int buttonNow = -3;if(event == CV_EVENT_LBUTTONDOWN){tmpAddr[0] = x;tmpAddr[1] = y;tmpAddr[2] = 0;tmpAddr[3] = 0;}else if(event == CV_EVENT_LBUTTONUP){tmpAddr[2] = x;tmpAddr[3] = y;buttonNow = choiceButton(tmpAddr, buttonAddr, buttonNum);on_button(buttonNow);}}
控制項選擇
int choiceButton(int* tmpAddr, int** buttonAddr, int size){int i, tmp; tmp = abs(tmpAddr[0] - tmpAddr[2]) + abs(tmpAddr[1] - tmpAddr[3]);if(tmp > 20){return -2;}for(i=0; i< size; i++){if((buttonAddr[i][0] < tmpAddr[0]) && (buttonAddr[i][2] > tmpAddr[0])){if((buttonAddr[i][1] < tmpAddr[1]) && (buttonAddr[i][3] > tmpAddr[3])){return i;}}}return -1;}
在滑鼠左鍵抬起的時候調用函數:choiceButton。 tmpAddr:滑鼠左鍵按下時候的座標和滑鼠左鍵抬起時候的座標。 buttonAddr: 控制項的個數和它們的座標資訊。 size:控制項的數量。 在choiceButton中,1、判斷滑鼠按下和抬起的座標是不是在同一個位置,不是的話就直接返回-2。 2、判斷滑鼠左鍵按下的座標是不是在控制項的範圍之類,是的話,就直接返回控制項編號。 3、如果滑鼠左鍵按下的位置沒有在任何一個控制項範圍內,返回 -1。
控制項響應
void on_button(int buttonNow){char str[20];sprintf(str,"%d", buttonNow);Mat img = cv::Mat(300, 300, CV_8UC3, 1);imshow(str, img);}
根據前面控制項選擇傳回來的參數,對應的用該參數作為空白圖片的顯示視窗名字,並顯示出來。
效果示範
對應的效果示範如下:
按下控制項:cancel,快顯視窗0。 按下控制項:add, 快顯視窗1。