Opencv3從頭開始(八)軌跡條回調與鼠標回調
軌跡條回調
createTrackbar("二值化","二值化",&threshold_val,255,on_trackbar);
on_trackbar(threshold_val, 0);
//軌跡條回調函數
void on_trackbar(int, void*){
threshold(image_gray,image_thre,threshold_val,255,THRESH_BINARY);
imshow("二值化",image_thre);
}
鼠標回調
//鼠標回調函數
namedWindow("鼠標",WINDOW_AUTOSIZE);
setMouseCallback("鼠標",on_mouse,0);
//鼠標回調函數
void on_mouse( int event, int x, int y, int, void* ){
if(event==CV_EVENT_LBUTTONDOWN){
flag=1;
rect=Rect(x,y,0,0);
}
else if(event==EVENT_MOUSEMOVE){
if(flag==1){
rect.width=x-rect.x;
rect.height=y-rect.y;
}
}
else if(event==CV_EVENT_LBUTTONUP){
flag=0;
rect.width=x-rect.x;
rect.height=y-rect.y;
rectangle(image,rect,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),2,8,0);
}
imshow("鼠標",image);
}
代碼如下:
/*
createTrackbar函數創建和使用軌跡條
SetMouseCallback鼠標回調函數
*/
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
void on_trackbar(int, void*);
void on_mouse( int event, int x, int y, int, void* );
using namespace std;
using namespace cv;
Mat image,image_gray,image_thre;
Rect rect;
int threshold_val= 125;
int flag=0;
RNG rng(12345);
int main(int argc, char* argv[]){
//灰度
image=imread("倉老師.jpg");
cvtColor(image,image_gray,COLOR_BGR2GRAY);
imshow("倉老師",image);
rect=Rect(-1,-1,0,0);
//創建回調條
namedWindow("二值化",WINDOW_AUTOSIZE);
createTrackbar("二值化","二值化",&threshold_val,255,on_trackbar);
on_trackbar(threshold_val, 0);
//鼠標回調函數
namedWindow("鼠標",WINDOW_AUTOSIZE);
setMouseCallback("鼠標",on_mouse,0);
waitKey(0);
return 0;
}
//軌跡條回調函數
void on_trackbar(int, void*){
threshold(image_gray,image_thre,threshold_val,255,THRESH_BINARY);
imshow("二值化",image_thre);
}
//鼠標回調函數
void on_mouse( int event, int x, int y, int, void* ){
if(event==CV_EVENT_LBUTTONDOWN){
flag=1;
rect=Rect(x,y,0,0);
}
else if(event==EVENT_MOUSEMOVE){
if(flag==1){
rect.width=x-rect.x;
rect.height=y-rect.y;
}
}
else if(event==CV_EVENT_LBUTTONUP){
flag=0;
rect.width=x-rect.x;
rect.height=y-rect.y;
rectangle(image,rect,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),2,8,0);
}
imshow("鼠標",image);
}