我研究过Opencv的setMouseCallback函数。
我知道有几个事件,列表如下:
CV_EVENT_MOUSEMOVE 0,
CV_EVENT_LBUTTONDOWN 1,
CV_EVENT_RBUTTONDOWN 2,
CV_EVENT_MBUTTONDOWN 3,
CV_EVENT_LBUTTONUP 4,
CV_EVENT_RBUTTONUP 5,
CV_EVENT_MBUTTONUP 6,
CV_EVENT_LBUTTONDBLCLK 7,
CV_EVENT_RBUTTONDBLCLK 8,
CV_EVENT_MBUTTONDBLCLK 9,
CV_EVENT_FLAG_LBUTTON 1, CV_EVENT_FLAG_RBUTTON 2, CV_EVENT_FLAG_MBUTTON 4, CV_EVENT_FLAG_CTRLKEY 8, CV_EVENT_FLAG_SHIFTKEY 16, CV_EVENT_FLAG_ALTKEY 32,
并且从我从这些事件得到的坐标,我可以绘制,例如:直线,圆,椭圆......等。
但不是直线,我想绘制随机线,就像"铅笔"或"刷" Microsoft Paint中的函数。
当我的鼠标在图像中移动时,CV_EVENT_MOUSEMOVE会返回所有坐标,但我不知道如何将它与CV_EVENT_LBUTTONDOWN组合以表示"开始绘制线"和CV_EVENT_LBUTTONUP来表示"完成绘制线"?
有没有人知道如何用setMouseCallback实现我的要求?
答案 0 :(得分:0)
我自己想出来了,
bool trigger;
Mat img;
void onMouse(int event, int x, int y, int flag, int param)
{
if(event == CV_EVENT_LBUTTONDOWN)
{
img = Mat::zeros(320, 240, CV_8UC3);
trigger = true;
}
if(event == CV_EVENT_LBUTTONUP)
{
trigger = false;
}
if(event == CV_EVENT_MOUSEMOVE)
{
if(trigger == true)
{
line(img, cvPoint(x, y), cvPoint(x, y), Scalar(0, 0, 255), 3, CV_AA, 0);
imshow("Drawing", img);
}
}
}
int main(int argc, char *argv[])
{
.
.
.
cvsetMouseCallback("Origin img", onMouse, NULL);
.
.
.
}