鼠标的响应与操作
功能:点击鼠标后返回起始点坐标,在输入图片中框出一个矩形框并将里面的图片单独提取出来。
Point sp(-1, -1);//保存点击鼠标时出示的点坐标。点击后点坐标一定非负,坐标设置成-1可以和触发回调函数后的坐标区分开。
Point ep(-1, -1);//保存松开鼠标时出示的点坐标。点击后点坐标一定非负,坐标设置成-1可以和触发回调函数后的坐标区分开。
Mat temp;//保存原始图片
static void on_draw(int event, int x, int y, int flags, void *userdata) {
Mat image = *((Mat*)userdata);//将void指针转换成Mat类的指针,再将里面保存的图像取出
if (event == EVENT_LBUTTONDOWN) {
sp.x = x;
sp.y = y;
std::cout <<"start point:" << sp << std::endl;
}
else if (event == EVENT_LBUTTONUP) {
ep.x = x;
ep.y = y;
int dx = ep.x - sp.x;
int dy = ep.y - sp.y;
if (dx > 0 && dy > 0) {
Rect box(sp.x, sp.y, dx, dy);
temp.copyTo(image);//刷新图片,可以去除选中的红框
imshow("ROI区域", image(box));//显示选中的区域
rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
imshow("鼠标绘制", image);
// ready for next drawing。将点坐标恢复到-1
sp.x = -1;
sp.y = -1;
}
}
else if (event == EVENT_MOUSEMOVE) {
if (sp.x > 0 && sp.y > 0) {//有全局变量Point sp(-1, -1);Point ep(-1, -1);来限制没有选定点绘制矩形时的MOVE操作
ep.x = x;
ep.y = y;
int dx = ep.x - sp.x;
int dy = ep.y - sp.y;
if (dx > 0 && dy > 0) {
Rect box(sp.x, sp.y, dx, dy);
temp.copyTo(image);//在每次绘制矩形之前都会将原图拷贝给image,这样就会把在MOVE过程中产生的矩形框覆盖掉,最后只剩下最后产生的矩形框
rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
imshow("鼠标绘制", image);
}
}
}
}
void QuickDemo::mouse_drawing_demo(Mat &image) {
namedWindow("鼠标绘制", WINDOW_AUTOSIZE);
setMouseCallback("鼠标绘制", on_draw, (void*)(&image));
imshow("鼠标绘制", image);
temp = image.clone();//将原始图片拷贝给temp
}