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); }
실행 화면
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는 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; }
실행 화면
lenna.jpg (400 x 400)