opencv學習之路(5)、鼠標和滑動條操作


一、鼠標事件

 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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM