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;
}
效果演示
對應的效果演示以下:
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈