鼠标选择图像上点或者闭合多边形

来源:互联网 发布:端口号的目的是 编辑:程序博客网 时间:2024/06/11 13:11

设计思路:
在主函数中选择工作模式:半自动模式下,双击鼠标左键得到一个标记点;手动模式下,单击左键选择闭合多边形顶点,单击右键结束一个闭合多边形选择。

#define AUTO 0#define SEMI_AUTO 1#define NON_AUTO 2int model = 0;//工作模式全局变量bool m_first = true;//手动起点标志全局变量int whole_i;void On_mouse_NON_AUTO(int event, int x, int y, int flags, void*);void On_mouse_SEMI_AUTO(int event, int x, int y, int flags, void*);int main(){    string impath2 = "./img/497.bmp";    Mat img2 = imread(impath2,0);    cout << "工作模式选择(0-自动 1-半自动 2-手动):" ;    cin >> model;    string wname = "半自动or手动";    imshow(wname, img2);    switch (model)    {    case AUTO:        cout << "自动" << endl;        break;    case SEMI_AUTO:        whole_i = 0;        setMouseCallback(wname, On_mouse_SEMI_AUTO, 0);        break;    case NON_AUTO:        m_first = true;        setMouseCallback(wname, On_mouse_NON_AUTO, 0);        whole_i = 0;        break;    }    waitKey( );    return 0;}void On_mouse_NON_AUTO(int event, int x, int y, int flags, void*){    Point pre_p,p0;    if (event == EVENT_LBUTTONDOWN)    {        if (m_first)        {            p0 = Point(x, y);            pre_p = p0;            m_first = false;            cout <<"起点:"<< p0.x << " " << p0.y << endl;                 }        else        {            pre_p = Point(x, y);            cout <<  pre_p.x << " " << pre_p.y << endl;                 }    }    else if(event == CV_EVENT_RBUTTONDBLCLK)    {        m_first = true;        whole_i++;        cout << "结束一圈啦!" << endl;    }}void On_mouse_SEMI_AUTO(int event, int x, int y, int flags, void*){    Point pre_p;    if (event == CV_EVENT_LBUTTONDBLCLK)    {        pre_p = Point(x, y);        cout << pre_p.x << " " << pre_p.y << endl;        whole_i++;    }}
阅读全文
0 0
原创粉丝点击