opencv類比button,opencvbutton

來源:互聯網
上載者:User

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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.