Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ OpenCV 마우스 이벤트 처리 방법 총정리

마우스 이벤트(Mouse Events)는 OpenCV가 제공하는 가장 유용한 기능 중 하나입니다. OpenCV를 활용하면 화면상의 마우스 포인터 위치를 실시간으로 추적할 수 있을 뿐만 아니라, 좌클릭·우클릭·휠클릭(중간 버튼 클릭)과 같은 다양한 클릭 동작도 감지할 수 있습니다.

OpenCV는 로보틱스와 컴퓨터 비전 분야에서 폭넓게 활용되고 있으며, 특히 로봇 제어나 영상 기반 인터랙션 시스템에서는 마우스 포인터의 위치와 클릭 정보를 추적하는 기능이 매우 자주 사용됩니다.

이번 글에서는 이미지 위에서 마우스 포인터의 위치를 추적하고, 클릭 이벤트를 감지하는 방법을 단계별로 살펴보겠습니다.

마우스 이벤트 처리의 핵심 요소

OpenCV에서 마우스 이벤트를 처리하려면 크게 세 가지 요소가 필요합니다.

  • 콜백 함수(Callback Function): 마우스 이벤트가 발생할 때마다 자동으로 호출되는 함수입니다. 이벤트 종류, 좌표(x, y) 등의 정보를 전달받습니다.
  • setMouseCallback(): 특정 윈도우에 콜백 함수를 등록하는 함수입니다.
  • 이벤트 상수: EVENT_LBUTTONDOWN(좌클릭), EVENT_RBUTTONDOWN(우클릭), EVENT_MBUTTONDOWN(중간 버튼 클릭), EVENT_MOUSEMOVE(마우스 이동) 등이 대표적입니다.

예제 코드

다음 프로그램은 마우스 포인터의 위치와 클릭 이벤트를 추적하는 방법을 보여줍니다.

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

// 마우스 움직임과 클릭을 추적하는 콜백 함수 //
void locator(int event, int x, int y, int flags, void* userdata){
    if (event == EVENT_LBUTTONDOWN){ // 좌측 버튼 클릭 시 //
        cout << "Left click has been made, Position:(" << x << "," << y << ")" << endl;
    } else if (event == EVENT_RBUTTONDOWN){ // 우측 버튼 클릭 시 //
        cout << "Rightclick has been made, Position:(" << x << "," << y << ")" << endl;
    } else if (event == EVENT_MBUTTONDOWN){ // 중간 버튼 클릭 시 //
        cout << "Middleclick has been made, Position:(" << x << "," << y << ")" << endl;
    } else if (event == EVENT_MOUSEMOVE){ // 마우스 포인터가 이동할 때 //
        cout << "Current mouse position:(" << x << "," << y << ")" << endl;
    }
}

int main() {
    Mat image = imread("bright.jpg"); // 이미지를 행렬에 불러오기 //
    namedWindow("Track"); // 이미지를 표시할 윈도우 선언 //
    setMouseCallback("Track", locator, NULL); // 정의된 윈도우에 마우스 콜백 함수 등록 //
    imshow("Track", image); // 윈도우에 이미지 출력 //
    waitKey(0); // 키 입력 대기 //
    return 0;
}

코드 설명

위 코드의 핵심 흐름은 다음과 같습니다.

  1. locator() 콜백 함수는 마우스 이벤트가 발생할 때마다 호출되며, 발생한 이벤트의 종류(event)와 해당 위치 좌표(x, y)를 전달받습니다.
  2. 좌클릭이 감지되면 EVENT_LBUTTONDOWN 조건문이 실행되어 클릭 위치가 콘솔에 출력됩니다. 우클릭과 중간 버튼 클릭도 각각 EVENT_RBUTTONDOWN, EVENT_MBUTTONDOWN으로 처리됩니다.
  3. 마우스가 이미지 위에서 움직일 때마다 EVENT_MOUSEMOVE 이벤트가 발생하여 현재 포인터의 좌표가 실시간으로 출력됩니다.
  4. main() 함수에서는 imread()로 이미지를 불러온 뒤, namedWindow()로 "Track"이라는 이름의 윈도우를 생성합니다.
  5. setMouseCallback() 함수를 통해 "Track" 윈도우에 locator 콜백 함수를 등록하면, 해당 윈도우 위에서 발생하는 모든 마우스 동작이 자동으로 추적됩니다.

실행 결과

프로그램을 실행하면 이미지가 담긴 윈도우가 나타나고, 마우스를 움직이거나 클릭할 때마다 콘솔 창에 아래와 같이 좌표 정보가 출력됩니다.

C++ OpenCV 마우스 이벤트 처리 방법 총정리

C++ OpenCV 마우스 이벤트 처리 방법 총정리

활용 팁

이 기본 구조를 응용하면 더욱 실용적인 기능을 만들 수 있습니다. 예를 들어, 드래그 시작점과 끝점의 좌표를 저장해 관심 영역(ROI)을 지정하거나, 클릭한 위치에 사각형·원 등의 도형을 그리는 인터랙티브 도구를 구현할 수 있습니다. 또한 flags 파라미터를 활용하면 Ctrl, Shift 같은 보조 키 입력 여부까지 함께 감지할 수 있어 더욱 정교한 사용자 입력 처리가 가능합니다.