C# OpenCV 강좌 : 제 37강 - 마우스 콜백

   

마우스 콜백 (OnMouseCallback)


1 CvWindow를 사용하여 새롭게 띄운 윈도우 창에서는 C#에 포함되어 있는 이벤트를 사용할 수 없습니다. OnMouseCallback을 사용하여 마우스에 관한 이벤트를 실행할 수 있습니다.


Form에서 마우스 이벤트 사용하기 : 6강 바로가기


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.


영상 사용하기 : 3강 바로가기
이미지 사용하기 : 4강 바로가기


Main Code


CvWindow win;
IplImage src;


win = new CvWindow("OpenCV", src);
win.OnMouseCallback += new CvMouseCallback(click);


private void click(MouseEvent eve, int x, int y, MouseEvent flag)
{
    if (eve == MouseEvent.LButtonDown)
    {
        string text = "X : " + x.ToString() + " Y : " + y.ToString();
        Cv.PutText(src, text, new CvPoint(x, y), new CvFont(FontFace.HersheyComplex, 0.5, 0.5), CvColor.Red);
        win.Image = src;
    }
    if (eve == MouseEvent.RButtonDown && (flag & MouseEvent.FlagCtrlKey) != 0)
    {
        Cv.Circle(src, x, y, 15, CvColor.GreenYellow);
        win.Image = src;
    }
}


Class Code


CvWindow win;
IplImage src;

전역 변수로 winsrc를 선언합니다. 이는 click()함수에서 지속적으로 사용되기 때문에 전역 변수로 선언합니다.


win = new CvWindow("OpenCV", src);
win.OnMouseCallback += new CvMouseCallback(click);

CvWindow가 표시될 곳에 삽입합니다. 만약, 폼을 로드하자마자 사용한다면 private void Form1_Load(object sender, EventArgs e){} 구문에 삽입합니다.

win을 선언하여 OpenCV의 제목을 가지고 src 이미지를 표시합니다.

win.OnMouseCallback += new CvMouseCallback(click);를 사용하여 win 창에 마우스 콜백사용될 함수를 포함시킵니다.

  • Tip : +=으로 선언해야합니다.


private void click(MouseEvent eve, int x, int y, MouseEvent flag)
{
    ...
}

click() 사용자 정의 함수를 만듭니다. eve마우스의 클릭에 대한 값을 의미하며 x, y마우스의 좌표입니다. flag플래그 키를 의미합니다.


if (eve == MouseEvent.LButtonDown)
{
    string text = "X : " + x.ToString() + " Y : " + y.ToString();
    Cv.PutText(src, text, new CvPoint(x, y), new CvFont(FontFace.HersheyComplex, 0.5, 0.5), CvColor.Red);
    win.Image = src;
}

마우스의 왼쪽 버튼을 클릭할 때 작동하며 src에 그린 후, win.Image = src;를 이용하여 다시 출력하는 방식입니다.


if (eve == MouseEvent.RButtonDown && (flag & MouseEvent.FlagCtrlKey) != 0)
{
    Cv.Circle(src, x, y, 15, CvColor.GreenYellow);
    win.Image = src;
}

마우스의 오른쪽 버튼을 클릭Ctrl키를 클릭을 동시에 할 때 작동하며 위와 같이 src에 그린 후 다시 출력하는 방식입니다. 플래그 키를 사용할 경우 (flag & MouseEvent.FlagCtrlKey) != 0을 사용해야 클릭한다는 것을 의미합니다. ==을 사용 시 클릭하지 않을 경우 입니다.


  • 마우스

    • LButtonDown : 마우스 왼쪽 버튼을 누를 때

    • LButtonUp : 마우스 왼쪽 버튼을 뗄 때

    • LButtonDoubleClick : 마우스 왼쪽 버튼을 더블 클릭할 때

    • MButtonDown : 마우스 휠 버튼을 누를 때

    • MButtonUp : 마우스 휠 버튼을 뗄 때

    • MButtonDoubleClick : 마우스 휠 버튼을 더블 클릭할 때

    • RButtonDown : 마우스 오른쪽 버튼을 누를 때

    • RButtonUp : 마우스 오른쪽 버튼을 뗄 때

    • RButtonDoubleClick : 마우스 오른쪽 버튼을 더블 클릭할 때

    • MouseMove : 마우스를 움직일 때


  • 플래그 키

    • FlagLButton : 마우스 왼쪽 버튼을 누른 상태로 드래그 할 때

    • FlagMButton : 마우스 휠 버튼을 누른 상태로 드래그 할 때

    • FlagRButton : 마우스 오른쪽 버튼을 누른 상태로 드래그 할 때

    • FlagShiftKey : Shift 키를 눌렀을 때

    • FlagCtrlKey : Ctrl 키를 눌렀을 때

    • FlagAltKey : Alt 키를 눌렀을 때


Result


2



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# OpenCV 강좌 : 제 38강 - 트랙바 ⤧  Previous post C# OpenCV 강좌 : 제 36강 - HDC