[HCI] 03. 도형 그리기 / 마우스, 키보드 입력 처리

조혜정·2021년 9월 27일
1
post-thumbnail

✔ Open CV 도형 그리기

1. 검정 윈도우 창 띄우기
Mat blackWindow = Mat(400, 600, CV_8UC3, Scalar(0, 0, 0));
imshow("Black Window", blackWindow);
2. line 선 그리기
line(blackWindow, Point(100, 100), Point(300, 300), Scalar(0, 0, 255), 5);
// blackWindow위에 (100, 100)에서 (300, 300)으로 빨간색(Scalar(0, 0, 255)) 두께가 5인 선을 그려라
// lineType, shift 생략 (default 값으로 들어간다.)
3. Rectangle 직사각형 그리기
rectangle(blackWindow, Point(250, 30), Point(450, 200), Scalar(0, 255, 0), 7);
// blackWindow위에 (250, 30)에서 (450, 200)으로 초록색(Scalar(0, 255, 0)) 두께가 7인 직사각형을 그려라
// lineType, shift 생략 (default 값으로 들어간다.)
4. Circle 원 그리기
circle(blackWindow, Point(100, 300), 60, Scalar(255, 0, 0), 3);
// blackWindow위에 (100, 300)에서 반지름이 60인 파란색(Scalar(255, 0, 0)) 두께가 3인 원을 그려라
// lineType, shift 생략 (default 값으로 들어간다.)
5. Ellipse 타원 그리기
ellipse(blackWindow, Point(300, 350), Point(100, 60), 45, 130, 270, Scalar(255, 255, 255), 5);
// blackWindow위에 (300, 350)에서 (100, 60) Size의 타원을 45도 시계방향으로 회전시키고
// 기존 타원의 130도부터 270도까지 흰색(Scalar(255, 255, 255)) 두께가 5인 타원을 그려라
// lineType, shift 생략 (default 값으로 들어간다.)
전체 코드
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat blackWindow = Mat(400, 600, CV_8UC3, Scalar(0, 0, 0));

	line(blackWindow, Point(100, 100), Point(300, 300), Scalar(0, 0, 255), 5);
	rectangle(blackWindow, Point(250, 30), Point(450, 200), Scalar(0, 255, 0), 7);
	circle(blackWindow, Point(100, 300), 60, Scalar(255, 0, 0), 3);
	ellipse(blackWindow, Point(300, 350), Point(100, 60), 45, 130, 270, Scalar(255, 255, 255), 5);

	imshow("Black Window", blackWindow);

	waitKey(0);
	return(0);
}
실행 화면

✔ Open CV 마우스 이벤트 처리

Callback Function (콜백 함수)
- 특정 함수가 어떤 함수의 인자로서 사용될 때 이 함수를 콜백 함수라고 한다.
Open CV Mouse Callback Function
// 1. Mouse Callback Function 정의

- 마우스의 상태에 변화가 생겼을 때 특정 함수를 호출할 수 있도록 사용자가 특정 함수를 정의하고 등록할 수 있다.
- 마우스에 변화가 생겼을 때 '어떤 일'을 할 것인지를 정의

void onMouse(int event, int x, int y, int flags, void* param){
    // 사용자 정의 함수로 함수 이름은 마음대로 정의할 수 있다.(onMouse() 대신 mouseCallback() 가능)
    // Event : 마우스 이벤트
    // x, y : 마우스 위치
    // Flags : 이벤트 부가정보
    // param : 기타 파라메터
}
// 2. Mouse Callback Function 등록
setMouseCallback("windowName", onMouse, &src);
마우스 이벤트 종류 (int event)
EVENT_LBUTTONDOWN 	 왼쪽 버튼 눌림
EVENT_MBUTTONDOWN	 가운데 버튼 눌림
EVENT_RBUTTONDOWN	 오른쪽 버튼 눌림

EVENT_LBUTTONUP		 왼쪽 버튼 UP
EVENT_MBUTTONUP		 가운데 버튼 UP
EVENT_RBUTTONUP		 오른쪽 버튼 UP

EVENT_MOUSEMOVE	 마우스 이동 
전체 코드
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 마우스 이벤트가 발생하면 호출되는 콜백 함수
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 마우스 이벤트가 발생하면 호출되는 콜백 함수
void onMouse(int event, int x, int y, int flags, void* src)
{
	if (event == EVENT_LBUTTONDOWN) { // 왼쪽 마우스가 눌리면
		Mat& img = *(Mat*)(src);
		circle(img, Point(x, y), 100, Scalar(0, 0, 255), 5);
		putText(img, "I found a lenna!", Point(x, y + 100), FONT_HERSHEY_PLAIN, 2.0, 255, 2);
		imshow("windowName", img);	// 영상이 변경되면 다시 표시한다.
	}
	else if (event == EVENT_RBUTTONDOWN) {}
	else if (event == EVENT_MBUTTONDOWN) {}
	else if (event == EVENT_MOUSEMOVE) {}
}

int main() {
	Mat image = imread("lenna.jpg", IMREAD_COLOR);
	if (image.empty()) {
		cout << "does not read the file\n";
	}

	imshow("windowName", image);

	setMouseCallback("windowName", onMouse, &image);

	waitKey(0);
	return 0;
}
실행 결과

✔ Open CV 키보드 이벤트 처리

Open CV는 waitKey()를 통해 키보드 입력을 받을 수 있다.
int key = waitKey(100); // delay 100
하지만, waitKey()는 1Byte의 키값을 입력받기 때문에
기능 키(F1, F2, ... , F12), 방향 키 (→, ←, ↑, ↓)등의 특수 키를 입력받을 수 없다.
이때, waitKeyEx()를 사용하게 되면 2Byte의 키값을 입력받아 특수키 입력이 가능하다.
int key = waitKeyEx(100); // delay 100
전체 코드
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(){
	Mat image = imread("lenna.jpg", IMREAD_COLOR);
	if (image.empty()) {
		cout << "does not read the file\n";
	}

	imshow("windowName", image);
  
 	while (true) {
	int key = waitKeyEx();
	if (key == 'q') break;
	else if (key == 2424832) { // <-
 	    image -= 50;
  	}
	else if (key == 2555904) { // ->
 	    image += 50;
 	}
	imshow("windowName", image);

	return 0;
}
실행 화면

✔ Test Image

lenna.jpg (400 x 400)

profile
ʜʏᴇᴘᴘʏ ᴅᴇᴠ

0개의 댓글