关于鼠标setMouseCallback()函数操作退出
之前一段时间做过鼠标行为操作,当时项目的要求,需要选用鼠标自定义选取检测区域,可是不能每一次检测识别线段都需要选取点,不符合用户体验,因此要求只需要开头选取一次Roi区域。本人也只是初学者一个,在网上翻遍了很多资料,发现都很少描述到对于setMouseCallback()如何退出的问题,因此我选择在这里记录一下,方便自己以后查看;同时也希望能够帮助有同样需求的朋友。
代码如下:
int main()
{
Mat img = imread("IMG_3593.jpg");
Mat dst;
vector<Vec4i>Points_vec;
Vec4i outputPoints;
if (img.empty())
{
cout << "Please input the right image" << endl;
return -1;
}
resize(img, dst, Size(img.cols * 0.2, img.rows * 0.2));
imshow("Source image", dst);
setMouseCallback("Source image", onMouse);
for (;;)
{
if (waitKey(50) == 'q')//非常重要
{
break;
}
}
setMouseCallback("Source image", NULL, NULL);
getPoints_vec(dst, Points_vec);
getPoints(Points_vec, outputPoints);
waitKey(0);
return 0;
}
其中非常关键的代码为:
setMouseCallback(“Source image”, NULL, NULL);此可以将鼠标响应事件与窗口解除绑定;除此之外还有第二种方法解除鼠标事件和窗口的绑定,如destroyWindow(“窗口名称”);
注意,注意,注意如下代码:
for (;;)
{
if (waitKey(50) == 'q')//非常重要
{
break;
}
}
该代码需要放在setMouseCallback(“Source image”, onMouse)和setMouseCallback(“Source image”, NULL, NULL)之间;循环格式怎么都无所谓,只要是死循环,中间放入一个退出循环的条件即可;个人理解该循环是我们操作鼠标参与的鼠标相应事件,事件结束后若不想继续鼠标响应,可以退出该循环执行后续语句块。