반응형

캡쳐된 게임 화면에 클릭을 하면, 마우스 클릭 좌표를 추출하는 기능을 써본다.

※ 깃헙에 OpenCvsharp 3.7 버전으로 예제가 있는데, OpenCV 3과 4는 함수 자체가 너무 달라서 고생을 좀 했다. trackback: 076923.github.io/posts/C-opencv-37/

1. Mouse callback 메서드 생성

-. OpenCV로 생성된 화면에 대해 마우스 이벤트가 발생하면 반응하는 (Mouse callback) 메서드를 만든다.

OpenCvSharp.MouseCallback _ClickOnVision = new OpenCvSharp.MouseCallback(ClickOnVision); // 함수선언

OpenCvSharp.Window win = new OpenCvSharp.Window("vision0"); //"vision0" 창에 대한 win 핸들러 생성

Cv2.SetMouseCallback(win.name, _ClickOnVision); //콜백 선언

2. 콜백 메서드 구성

-. 위와 같이 코드를 구성하면, "vision0" 창 위에 마우스가 '올라가기만 해도' 콜백 메서드가 발동한다.

-. 마우스 '클릭'이벤트 만을 걸러내는게 필요한데, OpenCvSharp에서는 MouseEventTypes라는 enumeration이 존재한다.shimat.github.io/opencvsharp_docs/html/fb1fcdbd-1d4c-9c37-262a-91bf473f5799.htm
-. 이 중 LButtonDown (마우스 왼쪽버튼 클릭)에 한정하는 메서드를 만든다.

        static void ClickOnVision(OpenCvSharp.MouseEventTypes eve, int x, int y, OpenCvSharp.MouseEventFlags flag, System.IntPtr _ptr)
        { 

            if(eve == MouseEventTypes.LButtonDown) //입력된 이벤트 타입이 L.ButtonDown(왼쪽클릭) 인 경우만 아래 함수 실행
            {
                string text = "X : " + x.ToString() + " Y : " + y.ToString(); 
                Debug.WriteLine(text);

                Cv2.PutText(positionScreen, text, new OpenCvSharp.Point(x, y), OpenCvSharp.HersheyFonts.HersheyComplex, 0.5, OpenCvSharp.Scalar.Yellow);

                Cv2.ImShow("position", positionScreen);

            }

        }

 

3. 화면에 마우스 좌표 표시

-. 위 함수의 PutText 함수는 OpenCv의 Mat 변수에 텍스트를 입력하는 함수로, 화면에 좌표 표시를 위해 사용했다.

Cv2.PutText(positionScreen, text, new OpenCvSharp.Point(x, y), OpenCvSharp.HersheyFonts.HersheyComplex, 0.5, OpenCvSharp.Scalar.Yellow);

Cv2.ImShow("position", positionScreen);

 

"position" 화면에 좌표 표기

4. 화면에 오버레이 표현

-. BitwiserOr  함수를 이용해 좌표가 표시된 화면과 캡쳐 화면을 겹친다.

Cv2.BitwiseOr(_imgFinal, positionScreen, _imgFinal);

Cv2.ImShow(visionName, _imgFinal);    

 

클릭 좌표가 겹쳐서 표기되는 최종 출력 창.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기