一、鼠標事件
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 Mat img(500,500,CV_8UC3,Scalar(255,255,255));//定義成全局變量 7 8 void OnMouse(int event,int x,int y,int flags,void* param){ 9 if(event==CV_EVENT_LBUTTONDOWN){//如果鼠標左鍵按下 10 cout<<"mouse down"<<endl;//控制台輸出 11 circle(img,Point(x,y),80,Scalar(255,255,0),2,8);//在全局變量img上畫圓 12 } 13 } 14 15 void main(){ 16 namedWindow("mouse",CV_WINDOW_AUTOSIZE); 17 setMouseCallback("mouse",OnMouse,0); 18 while(1){ 19 imshow("mouse",img); 20 if(27==waitKey(10))//每隔10毫秒檢測是否按下esc鍵 21 break; 22 } 23 }
另外一種方法,不必將img圖像設置為全局變量,只需傳入其地址即可。
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 Point pt; 7 void OnMouse(int event,int x,int y,int flags,void* param){ 8 Mat img=*(Mat*)param;//將param強制轉換為Mat指針,*(Mat*)=Mat,就如*(int*)=int一樣 9 switch(event){ 10 case CV_EVENT_LBUTTONDOWN://鼠標左鍵按下時 11 pt.x=x; 12 pt.y=y; 13 break; 14 case CV_EVENT_LBUTTONUP://鼠標左鍵抬起時 15 rectangle(img,pt,Point(x,y),Scalar(0,255,0),2,8); 16 break; 17 default: 18 break; 19 } 20 } 21 22 void main(){ 23 Mat img(500,500,CV_8UC3,Scalar(255,255,255)); 24 namedWindow("mouse",CV_WINDOW_AUTOSIZE); 25 setMouseCallback("mouse",OnMouse,&img);//傳入img的地址,這樣就不必將img設置成全局變量了 26 27 while(1){ 28 imshow("mouse",img); 29 if(27==waitKey(10))//每隔10毫秒檢測是否按下esc鍵 30 break; 31 } 32 }
二、滑動條操作
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 Mat dst; 7 int value=20; 8 9 void onChange(int,void* param){ 10 Mat src=*(Mat*)param; 11 threshold(src,dst,value,255,THRESH_BINARY);//二值化 12 //Canny(src,dst,value,255);//canny邊緣檢測 13 imshow("TrackBar",dst); 14 } 15 16 void main(){ 17 Mat src=imread("1.jpg",0);//讀入灰度圖 18 namedWindow("TrackBar",CV_WINDOW_AUTOSIZE); 19 createTrackbar("Threshold","TrackBar",&value,255,onChange,&src); 20 21 threshold(src,dst,value,255,THRESH_BINARY); 22 //Canny(src,dst,value,255); 23 imshow("TrackBar",dst);// 21/22/23這三行代碼如果去掉的話,在未調整滑動條的情況下,不會有畫面顯示 24 25 waitKey(0); 26 }