/** @brief Callback function for mouse events. see cv::setMouseCallback
@param event one of the cv::MouseEventTypes constants.
@param x The x-coordinate of the mouse event.
@param y The y-coordinate of the mouse event.
@param flags one of the cv::MouseEventFlags constants.
@param userdata The optional parameter.
*/
typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
举个例子:
通过鼠标画框,从图像中截取ROI,并保存。
Point sp(-1, -1);
Point ep(-1, -1);
Mat temp;
int i = 0;
static void onMouse(int event, int x, int y, int flags, void *userdata)
{
char savepath[20];
Mat image = *((Mat*)userdata);
if (event == EVENT_LBUTTONDOWN)//左键按下
{
sp.x = x;
sp.y = y;
}
else if (event == EVENT_LBUTTONUP)//左键抬起
{
memset(savepath,0,10);
i++;
snprintf(savepath,20,"ROI_%d.png", i);
cout << savepath << endl;
ep.x = x;
ep.y = y;
if (((ep.x - sp.x) > 0) && ((ep.y - sp.y) > 0))
{
imshow("onMouse", image);
temp.copyTo(image);
Mat ROI = image(Range(sp.y, ep.y), Range(sp.x, ep.x));
imshow("ROI", ROI);
imwrite(savepath, ROI);//保存ROI
sp.x = -1;
sp.y = -1;//复位
}
}
else if (event == EVENT_MOUSEMOVE)//鼠标移动
{
if (sp.x > 0 && sp.y > 0)
{
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);
rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
imshow("onMouse", image);
}
}
}
}
void OpencvExample::Example_Mouse(Mat &image)
{
namedWindow("onMouse", WINDOW_AUTOSIZE);
setMouseCallback("onMouse", onMouse, (void*)(&image));
imshow("onMouse", image);
temp = image.clone();
}