1:窗口滑动条:
代码示例:通过滑动条改变亮度
static void on_change(int a, void* userdata)
{
Mat temp = *((Mat* )userdata);
Mat res;
addWeighted(temp, 1, 0, 0, a, res);
imshow("trackbar_operate", res);
}
void visionagin::TrackbarOperate(Mat& img)
{
int current_val = 50;
int max_val = 200;
namedWindow("trackbar_operate", WINDOW_AUTOSIZE);//必须先创建窗口
createTrackbar("亮度调整", "trackbar_operate", ¤t_val, max_val, on_change,(void*)&img);
on_change(current_val, (void*)&img);
//imshow("trackbar_operate", img);在回调函数里显示
}
2:鼠标事件:
鼠标响应就是当鼠标位于对应的图像窗口内时,时刻检测鼠标状态,当鼠标状态发生改变时,调用回调函数,并根据回调函数中的判断逻辑选择执行相应的操作.例如 ,回调函数中只处理鼠标左键按下的事件 ,即判断 event 标志是否为 EVENT_LBUTIONDOWN,只有当 event=EVENT _BUTTONDOWN 肘,才有相应的逻辑操作,否则将不会进行任何操作。
代码:
static void on_mouse(int event, int x, int y, int flag, void* userdata)
{
Mat temp = *((Mat*)userdata);
Point prept(x, y);//鼠标左键按下时的起始坐标
if (event == EVENT_LBUTTONDOWN )
{
cout << "起始坐标是:" << prept << endl;
}
if (event == EVENT_MOUSEMOVE && (flag & EVENT_FLAG_LBUTTON))
{
//通过改变像素点的颜色显示轨迹
/*
temp.at<Vec3b>(y, x) = (255, 255, 255);//矩阵几行几列,对应y,x
imshow("鼠标操作", temp);
*/
Point curpt(x, y);//通过连续画直线显示
line(temp, prept, curpt, Scalar(0, 0, 255), 2);
prept = curpt;
imshow("鼠标操作", temp);
}
}
void visionagin::MouseOperate(Mat& img)
{
namedWindow("鼠标操作", WINDOW_AUTOSIZE);
setMouseCallback("鼠标操作", on_mouse, (void*)&img);
imshow("鼠标操作", img);
}
两种方法显示鼠标移动轨迹:
1.改变鼠标坐标像素值;
2.连续画直线。
运行后发现存在问题:鼠标运行过快,轨迹的显示会断断续续,还未找到解决方案。。。