多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > opencv的鼠標以及鍵值使用

opencv的鼠標以及鍵值使用

來源:程序員人生   發布時間:2015-03-30 08:41:53 閱讀次數:2878次

簡介

  本章是學習opencv上鍵盤和鼠標相應的操縱與實例。


鍵盤響應

#include <math.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv/cv.h> int main(int agrc, char* argv[]){ int c; int exit = 0; cv::Mat src=cv::imread(argv[1],1); cv::imshow("22", src); while(!exit){ c = cv::waitKey(0); switch(c){ case 'w': printf("w "); break; case 'a': printf("a "); break; case 's': printf("s "); break; case 'd': printf("d "); break; case 'q': printf("exit "); exit = 1; break; default: printf("c:%d ", c); } } return 0; }

  如代碼所示,主要就是waitKey中的參數,小于等于0表示1直等待鍵值,大于0的表示等待多少毫秒,超時就返回⑴,否則就返回對應的鍵值。


鼠標響應

#include <math.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv/cv.h> void on_mouse( int event, int x, int y, int flags, void* ustc) { char *temp = (char *) ustc; printf("temp:%s, event:%d, flags:%d ", temp, event, flags); } int main(int agrc, char* argv[]){ char str[4] = "tao"; cv::Mat src=cv::imread(argv[1],1); cv::imshow("src",src); cvSetMouseCallback( "src", on_mouse, str); cv::waitKey(0); cv::waitKey(0); cvDestroyAllWindows(); return 0; }

  對應代碼如上所示,通過函數cvSetMouseCallback,綁定了鼠標事件的相應窗口為:"src",響應函數為:on_mouse,和可以往該響應函數傳入的參數指針:str。 如果沒有參數需要傳入,可以直接置為0或NULL。   接著看下它的響應函數on_mouse,先看下該函數的幾個參數,首先是:event用來描寫鼠標的點擊事件。   highgui/highgui_c.h中有定義以下變量:
enum
{
    CV_EVENT_MOUSEMOVE      =0,        //鼠標移動
    CV_EVENT_LBUTTONDOWN    =1,        //鼠標左鍵按下
    CV_EVENT_RBUTTONDOWN    =2,        //鼠標右鍵按下
    CV_EVENT_MBUTTONDOWN    =3,        //鼠標中鍵按下
    CV_EVENT_LBUTTONUP      =4,        //鼠標左鍵彈起
    CV_EVENT_RBUTTONUP      =5,        //鼠標右鍵彈起
    CV_EVENT_MBUTTONUP      =6,        //鼠標中鍵彈起
    CV_EVENT_LBUTTONDBLCLK  =7,        //鼠標左鍵雙擊
    CV_EVENT_RBUTTONDBLCLK  =8,        //鼠標右鍵雙擊
    CV_EVENT_MBUTTONDBLCLK  =9         //鼠標中鍵雙擊
};
  這些變量就是觸發鼠標事件后,對應的event根據鼠標不同操作返回的對應的值,每一個值的對應意義如上述。
  然后:x,y對應的為鼠標當前坐標。   接著:flag描寫鼠標的拖拽事件。   highgui/highgui_c.h中有定義以下變量:
enum
{
    CV_EVENT_FLAG_LBUTTON   =1,     //鼠標左鍵拖拽(按下鼠標左鍵,然后在窗口中拖動鼠標)
    CV_EVENT_FLAG_RBUTTON   =2,     //鼠標右鍵拖拽
    CV_EVENT_FLAG_MBUTTON   =4,     //鼠標中鍵拖拽
    CV_EVENT_FLAG_CTRLKEY   =8,     //按下鍵值CTRL不放
    CV_EVENT_FLAG_SHIFTKEY  =16,    //按下鍵值SHIFT不放
    CV_EVENT_FLAG_ALTKEY    =32     //按下鍵值ALT不放
};
  flag對應返回響應參數如上述,需要注意1些組合:比如按下鍵值CTRL的同時按下鼠標左鍵拖拽,flag就變成了:9=1+8。如果是按下CTRL+鼠標右鍵則變成:10=8+2。   最后的void* 類型ustc,就是對應之前傳入的str,我傳入的str類型為char*,則直接將ustc轉回char*便可;如果是傳入為0或NULL,則無需處理;如果是 其他類型指針,則轉化為對應的類型。


使用實例

  這里做1個程序的實例:在圖象上畫1個根據鼠標拖拽而變化的矩形,然后按下鍵值‘C’以后,將對應被畫了矩形的位置復制為新圖片顯示;按下'q'鍵,退出程序。
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
 
using namespace cv;
 
cv::Mat src;
char pic_name[20];
int pic_info[4];
 
void on_mouse( int event, int x, int y, int flags, void* ustc)  
{  
	if(event == CV_EVENT_LBUTTONDOWN){
		pic_info[0] = x;   /*width1*/
		pic_info[1] = y;   /*height1*/
		pic_info[2] = 0;   /*width2*/
		pic_info[3] = 0;   /*height2*/
	}else if(event == CV_EVENT_LBUTTONUP){
		pic_info[2] = x;
		pic_info[3] = y;
		src=cv::imread(pic_name,1);  
		cv::rectangle(src,cvPoint(pic_info[0], pic_info[1]),cvPoint(pic_info[2], pic_info[3]),cvScalar(255,0,0),2);	
		cv::imshow("src",src);
	}
	if(flags == CV_EVENT_FLAG_LBUTTON){
		pic_info[2] = x;
		pic_info[3] = y;
		src=cv::imread(pic_name,1);  
		cv::rectangle(src,cvPoint(pic_info[0], pic_info[1]),cvPoint(pic_info[2], pic_info[3]),cvScalar(255,0,0),2);	
		cv::imshow("src",src);
	}
	printf("%d %d %d %d
", pic_info[0], pic_info[1], pic_info[2], pic_info[3]);
}  
 
int main(int agrc, char* argv[]){
	bool exit = false;
	char c;
	cv::Mat imageROI;
 
	memcpy(pic_name,argv[1],sizeof(argv[1]));
 
	src=cv::imread(pic_name,1);  
	cv::imshow("src",src);
 
	cvSetMouseCallback( "src", on_mouse, NULL);
	while(!exit){
		c = cv::waitKey(0);
		if(c == 'c'){
			if((pic_info[0] != 0) && (pic_info[1] != 0) && (pic_info[2] != 0) && (pic_info[3] != 0)){
				imageROI = src(cv::Rect(pic_info[0], pic_info[1], pic_info[2]-pic_info[0], pic_info[3]-pic_info[1]));
				cv::imshow("ROI", imageROI);
			}
		}else if(c == 'q'){
			exit = true;	
		}
	}
	cvDestroyAllWindows();  
 
	return 0;  
}  


效果演示

  對應的效果演示以下:
Opencv wt 17 1.jpg
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 永久免费毛片在线播放 | 成人黄页网站 | 日韩精品欧美 | 国产精品高清久久久久久久 | 免费jizz在在线播放国产 | 手机看片日韩日韩国产在线看 | 色交视频| 免费视频h| 国产精品日韩欧美一区二区 | 亚洲欧美视频 | 中文国产成人精品久久一 | 欧美精品99久久久久久人 | 国产欧美日韩综合在线一 | 一本中文字幕一区 | 欧美亚洲日本一区 | 国产精品亚洲高清一区二区 | 成人一级网站 | 国产成在线观看免费视频成本人 | 国产成人一级片 | 全国男人的天堂网站 | 国内交换一区二区三区 | 青娱乐久久 | 91久久精品都在这里 | 波多野结衣一区二区在线 | 日本高清中文字幕视频在线 | 国内精品久久久久影院中国 | 国产一区二区精品 | 久久精品一区二区免费看 | 国产成人精品三区 | 欧美日韩一区二区三区四区 | 久久福利网站 | 性xxx欧美 | 精品国产欧美一区二区三区成人 | 国产精品国产三级国产专区5o | 国产九九视频在线观看 | 日本护士18一25 | 成人精品在线视频 | 亚洲性色视频 | 动画毛片| 亚洲区精品久久一区二区三区 | 免费播放欧美毛片欧美a |