窗口交互操作
##### (1)图像窗口滑动条
Open-CV 中创建滑动条函数原型为:
int createTrackbar(const String& trackbarname, const String& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
trackbarname :滑动条名称
winname :创建滑动条窗口名称
value:滑动条初始值指针
count:滑动条最大值
onChange:回调函数,滑动时调用该函数更新数据,函数原型----------void Foo(int , void*)
void Foo(int , void*): int为滑动条的值,void*为任意类型数据,按需求传入
userdata:传递给回调函数的可选参数
利用crateTrackbar() 可实现亮度调整
//增加亮度演示
//回调函数实现
static void track(int light,void*img)
{
Mat imgg = *(Mat*)img;
Mat m = Mat::zeros(imgg.size(),imgg.type());
Mat dst = Mat::zeros(imgg.size(), imgg.type());
addWeighted(imgg, 1.0, m, 0, light, dst); //加法增加亮度
imshow("亮度", dst);
}
// 创建Trackbar()
void tract_bar_demo(Mat& img)
{
namedWindow("亮度", WINDOW_AUTOSIZE);
int maxnum = 200; //最大亮度
int con_value = 0; // 初始亮度
createTrackbar("contrast:", "亮度", &con_value, maxnum, track_con, (void*)(&img));
}
//同理可实现亮度减小操作
运行tract_bar_demo:亮度调节为80时图像明显增亮
(2)鼠标响应
设置鼠标响应函数原型为
void setMouseCallback(const String& winname, MouseCallback onm ouse, void* userdata = 0);
winname: 添加鼠标窗口名称
onMouse: 鼠标响应的回调函数
userdata: 传递可选参数,与Foo中void*类似
回调函数原型为
typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
event: 鼠标响应标注,为枚举类型,根据鼠标不同操作变化
x,y: 为鼠标在图像中的x,y坐标
flags:鼠标拖拽类型,为枚举类型,根据鼠标不同操作变化
//event参数含义
enum MouseEventType
{
EVENT_MOUSEMOVE = 0, //!< 表示鼠标指针已移动到窗口上方。
EVENT_LBUTTONDOWN = 1, //!< 表示鼠标左键被按下。
EVENT_RBUTTONDOWN = 2, //!< 表示鼠标右键被按下。
EVENT_MBUTTONDOWN = 3, //!< 表示鼠标中键被按下。
EVENT_LBUTTONUP = 4, //!< 表示释放鼠标左键。
EVENT_RBUTTONUP = 5, //!< 表示释放鼠标右键。
EVENT_MBUTTONUP = 6, //!< 表示鼠标中键释放。
EVENT_LBUTTONDBLCLK = 7, //!< 表示双击鼠标左键。
EVENT_RBUTTONDBLCLK = 8, //!< 表示双击鼠标右键。
EVENT_MBUTTONDBLCLK = 9, //!< 表示双击鼠标中键。
EVENT_MOUSEWHEEL = 10,//!< 正值和负值分别表示向前和向后滚动。
EVENT_MOUSEHWHEEL = 11 //!< 正值和负值分别表示向右和向左滚动。
}
//flags参数含义
enum MouseEventFlags {
EVENT_FLAG_LBUTTON = 1, //!< 表示鼠标左键未按下。
EVENT_FLAG_RBUTTON = 2, //!<表示鼠标右键未按下。
EVENT_FLAG_MBUTTON = 4, //!< 表示鼠标中键未按下。
EVENT_FLAG_CTRLKEY = 8, //!< 表示按下“CTRL”
EVENT_FLAG_SHIFTKEY = 16,//!< 表示按下SHIFT键。
EVENT_FLAG_ALTKEY = 32 //!< 表示按下ALT键。
};
利用setMouseCallback()可用鼠标绘制矩形,圆形等
// 绘制椭圆演示
//回调函数
Point sp(-1, -1); // 鼠标按下的点坐标
Point ed(-1, -1); // 鼠标松开的点坐标
Mat temp;
static void on_draw(int event, int x, int y, int flag, void* userdata)
{
Mat img = *((Mat*)userdata);
if (event == EVENT_LBUTTONDOWN)
{//当按下左键时记录起始点
sp.x = x;
sp.y = y;
cout << sp;
}
else if (event == EVENT_LBUTTONUP)
{// 当松开左键时记录结束点,绘制后将起始点初始化
ed.x = x;
ed.y = y;
int dx = (ed.x + sp.x)/2;
int dy = (ed.y + sp.y)/2;
RotatedRect rorect;//
rorect.center = Point(dx, dy);
rorect.angle = 0;
rorect.size.width = abs(ed.x-sp.x);
rorect.size.height = abs(ed.y - sp.y);
ellipse(img, rorect, Scalar(0, 255, 255),1,8);//在两点确定的矩形中绘制椭圆
imshow("绘制", img);
temp = img.clone();
sp.x = -1;
sp.y = -1;
}
else if (event == EVENT_MOUSEMOVE && sp.x>0 && sp.y>0)
{//鼠标移动时持续绘制
ed.x = x;
ed.y = y;
temp.copyTo(img);
Rect rect(sp, ed);
float dx = (ed.x + sp.x) / 2;
float dy = (ed.y + sp.y) / 2;
RotatedRect rorect;
rorect.center = Point(dx, dy);
rorect.angle = 0;
rorect.size.width = abs(ed.x - sp.x);
rorect.size.height = abs(ed.y - sp.y);
ellipse(img, rorect, Scalar(0, 255, 255), 2, 8);
imshow("绘制", img);
}
}
//设置鼠标响应
void QuickDemo::mouse_Draw(Mat& img)
{
namedWindow("绘制", WINDOW_AUTOSIZE);
setMouseCallback("绘制", on_draw,(void*)(&img));
imshow("绘制",img);
temp = img.clone();
}
在打开的图片中绘制椭圆
标签:窗口,鼠标,img,int,void,sp,OpenCV,EVENT From: https://blog.csdn.net/sunny_code_/article/details/140497103