본문 바로가기

# 미사용/OpenCV

[OpenCV] 윈도우 및 이벤트 관리


 윈도우 창 관리

Mat img = imread("./opencv_logo.png", IMREAD_UNCHANGED);
CV_Assert(img.data);


//! window_name이라는 이름으로 윈도우 생성.
//! 윈도우의 크기는 후에 지정된 행렬의 크기에 따라 변경됨.
namedWindow("window_name", WINDOW_AUTOSIZE);
waitKey();


//! window_name2에 img 표시.
//! 해당 namedWindow가 없다면 직접 생성함.
imshow("window_name2", img);
waitKey();


//! 해당 윈도우 창을 (x, y)좌표로 이동.
moveWindow("window_name2", 50, 50);
waitKey();


//! 해당 윈도우 창의 크기를 재조정.
resizeWindow("window_name2", 50, 50);
waitKey();


//! window_name이라는 이름의 윈도우를 제거.
destroyWindow("window_name2");
waitKey();


//! 모든 윈도우를 제거.
destroyAllWindows();



 키보드 이벤트 처리

int waitKey(ms)는 눌린 키 값을 반환한다.

단, OpenCV 윈도우가 최상위어야만 waitKey가 감지할 수 있다.

  • ms이 0보다 같거나 작으면, 무한 대기.

  • 양수라면, 지정된 시간만큼 대기하고 키 이벤트가 없으면 -1반환.



 마우스 이벤트 처리

setMouseCallback(window_name,  callback,  data)를 사용한다.


/**
 * 마우스 이벤트 콜백 함수
 *
 * @param event 발생한 마우스 이벤트.
 * @param x     눌린 위치 x좌표
 * @param y     눌린 위치 y좌표
 * @param flags 특수키 여부
 * @param data  기타 데이터. (옵션)
 */
void onMouse(int event, int x, int y, int flags, void *data){
    switch (event){
        case EVENT_LBUTTONDOWN:
            if(flags & EVENT_FLAG_CTRLKEY){
                cout << "CTRL + ";
            }
            if(flags & EVENT_FLAG_ALTKEY){
                cout << "ALT + ";
            }
            cout << "LEFT_DOWN" << '\n';
            break;

        case EVENT_LBUTTONUP:
            cout << "LEFT_UP" << '\n';
            break;

        default:
            break;
    }
}


//! test라는 window에 onMouse 콜백을 셋팅한다.
setMouseCallback("test", onMouse, nullptr);




 트랙바 삽입 및 제어

opencv trackbar에 대한 이미지 검색결과



example)

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

string title = "title";
Mat image = Mat(Size(200, 200), CV_8UC3);
int r = 128;
int g = 128;
int b = 128;
int on = 1;


//! 전역변수 rgb를 사용하여 배경색을 바꾼다.
void apply_rgb(){
    Scalar_<int> scalar = on ? Scalar_<int>(b, g, r) : Scalar_<int>(0, 0, 0);
    image = scalar;
    imshow(title, image);
}


/**
 * 트랙바가 움직였을 때, 호출되는 콜백함수.
 *
 * @param value 변경된 값의 수치.
 * @param data  유저가 넘긴 데이터.
 */
void onChange(int value, void *data){
    string name((const char*)data);
    cout << name << " changed to " << value << '\n';
    apply_rgb();
}


int main() {
    imshow(title, image);
    apply_rgb();

    //! 트랙바를 붙인다.
    createTrackbar("R", title, &r, 255, onChange, (void*)"R_");
    createTrackbar("G", title, &g, 255, onChange, (void*)"G_");
    createTrackbar("B", title, &b, 255, onChange, (void*)"B_");
    createTrackbar("ON/OFF", title, &on, 1, onChange, (void*)"ON_");

    //! 트랙바에 관련된 다양한 함수.
    int NEW_MAX = 200;
    int NEW_MIN = 150;
    int NEW_POS = 100;
    setTrackbarMax("R", title, NEW_MAX);
    setTrackbarMin("G", title, NEW_MIN);
    setTrackbarPos("B", title, NEW_POS);
    int pos = getTrackbarPos("ON/OFF", title);

    //! 키 입력을 기다린다.
    cout << waitKey() << '\n';
}