Download presentation
Presentation is loading. Please wait.
Published byΔημήτηρ Πρωτονοτάριος Modified 6년 전
1
Multimedia Programming 9: Text, Mouse Callback and Drawing
Departments of Digital Contents Sang Il Park
2
Outline Writing Text Mouse Callback in OpenCV Drawing
3
Writing Text in OpenCV OpenCV에서 글자 출력
4
C에서 문자를 기억하는 변수형 문자타입 char a; char b; a = ‘A’; b = 65;
char : 1 Byte = 256가지 문자를 가지고 있는 문자표에 대응 char a; char b; a = ‘A’; b = 65; 변수의 정의 ‘ ’ 로 문자임을 표시. 숫자는 문자표의 65번째 문자를 의미.
5
문자표(ASCII)
6
문자열 한 문자가 아니라 문장(문자의 집합 = 문자열)은 어떻게 표현할까? 문자열 : char의 배열
7
문자열 문자(char) 가 여러 개 이어져 있는 것 NULL(0) 문자 문자열의 끝을 표현
‘E’ ‘L’ ‘L’ ‘O’ ‘\0’ NULL(0) 문자 문자열의 끝을 표현
8
NULL 문자 0을 의미 (ASCII 문자표의 0번째 특수문자) 문자열의 끝은 반드시 NULL로 끝나야 한다.
char a=‘\0’; char b = 0;
9
OpenCV에서 문자열 출력법 1. 폰트의 종류 및 크기를 결정한다 (초기화)
2. 문자열을 원하는 위치에 원하는 색으로 그려준다 cvInitFont( CvFont * font, int face, hscale, vscale ); cvPutText(IplImage *img, char * text, CvPoint org, CvFont * font, CvScalar color );
10
cvInitFont : 폰트 설정 CvFont: 폰트의 설정을 기억하는 구조체 변수 face: 사용할 글씨체의 이름
cvInitFont( CvFont * font, int face, hscale, vscale ); CvFont: 폰트의 설정을 기억하는 구조체 변수 face: 사용할 글씨체의 이름 hscale, vscale: 가로 세로 확대율 정상크기는 모두 1.0으로 준다. CV_FONT_HERSHEY_SIMPLEX : normal size sans-serif font CV_FONT_HERSHEY_PLAIN : small size sans-serif font CV_FONT_HERSHEY_DUPLEX : normal size sans-serif font CV_FONT_HERSHEY_COMPLEX : normal size serif font CV_FONT_HERSHEY_TRIPLEX : normal size serif font CV_FONT_HERSHEY_COMPLEX_SMALL : smaller version CV_FONT_HERSHEY_SCRIPT_SIMPLEX : hand-writing style font CV_FONT_HERSHEY_SCRIPT_COMPLEX : more complex variant
11
cvPutText : 글자 그리기 img: 글을 쓸 이미지 text: 문자열을 나타내는 char 배열
cvPutText(IplImage *img, char * text, CvPoint org, CvFont * font, CvScalar color ); img: 글을 쓸 이미지 text: 문자열을 나타내는 char 배열 font: 폰트의 설정을 기억하고 있는 구조체 color: 글자의 색 org: 글씨의 기준 위치 (글씨의 왼쪽 아래모서리) 점의 위치를 표현하는 구조체: CvPoint cvPoint(x,y) 함수를 사용하면 쉽게 쓸 수 있다
12
글자 쓰는 예제 (100,100)의 위치에 “ABC”를 출력하라 char text[4];
text[0] = ‘A’; text[1] = ‘B’; text[2] = ‘C’; text[3] = 0; CvFont font; // cvInitFont( CvFont * font, int face, hscale, vscale ); cvInitFont (&font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0); // cvPutText(IplImage *img, char * text, CvPoint org, CvFont * font, CvScalar color ); cvPutText (img, text, cvPoint(100,100), &font, CV_RGB(0,0,0));
13
Announcement: PA #2 제출: 소스코드 제출: 10월 5일(일요일) 저녁 11시59분까지
이메일로 제출: 이메일의 제목: [멀티미디어1(2)반] 학번-이름 실행 파일(*.cpp/*.h)은 하나일 경우는 그냥 제출, 이미지를 포함, 여러 개일 경우는 압축(zip) 후 제출 압축파일 이름: 학번-이름.zip 소스 코드 내에 주석을 충실히 달 것 보고서 제출: 10월 6일(월요일) 수업시간 전까지
14
Programming Assignment #2
테스트 이미지:
15
Programming Assignment #2
테스트 이미지:
16
Programming Assignment #2
테스트 이미지:
17
Mouse Callback in OpenCV
18
Mouse With OPENCV
19
Keyboard With OPENCV int cvWaitKey(interval)
20
Mouse With OPENCV cvSetMouseCallback(…)
21
Mouse Callback? 콜백 함수(Callback): 마우스 콜백(mouse callback):
특정 함수가 어떤 함수의 인자로서 사용될 때 이 함수를 콜백 함수라고 한다. 마우스 콜백(mouse callback): 마우스의 상태에 변화가 생겼을 때 불리는 함수 예시) 마우스가 움직인다 왼(오른) 버튼이 눌리고 있음(올라가고 있음), 더블클릭, …
22
마우스 콜백 사용하기 OpenCV에서는 사용자가 임의의 함수를 만들고 이를 마우스에 변화가 생겼을 때 호출되게 할 수 있다.
이를 위해서는 다음 2가지 일을 하여야 한다: 구현(Implementation) 마우스에 변화가 생겼을 때 무엇을 할 것인가?를 정의함. 등록(Registration) 위에 정의한 함수를 opencv에게 사용하겠다고 등록시킴. void yourFunction (int event, int x, int y, int flags, void *param); void cvSetMouseCallback(window_name, yourFunction)
23
구현(Implementation) 함수의 이름은 자유롭게 지을 수 있다 예) on_mouse(..), myMouse(…), …
void yourFunction (int event, int x, int y, int flags, void *param); 함수의 이름은 자유롭게 지을 수 있다 예) on_mouse(..), myMouse(…), … 입력 인자들은 OpenCV가 알려주는 것으로 마우스에 어떤 변화가 생겼는 지 알려주는 정보가 담겨있다.
24
Implementation OpenCV가 넘겨주는 메세지 어떤 마우스 관련 이벤트 종류인지 알려줌 Examples)
void yourFunction (int event, int x, int y, int flags, void *param); OpenCV가 넘겨주는 메세지 어떤 마우스 관련 이벤트 종류인지 알려줌 Examples) CV_EVENT_MOUSEMOVE (마우스가 움직임) CV_EVENT_LBUTTONDOWN (왼쪽버튼이 눌리고 있음) CV_EVENT_RBUTTONDOWN (오른버튼이 눌리고 있음) CV_EVENT_MBUTTONDOWN (중간버튼이 눌리고 있음) CV_EVENT_LBUTTONUP (왼쪽버튼이 올라가고 있음) CV_EVENT_RBUTTONUP (오른버튼이 올라가고 있음) CV_EVENT_MBUTTONUP (중간버튼이 올라가고 있음)
25
Implementation OpenCV가 넘겨주는 메세지 마우스의 현재 위치를 표현 (x,y)
void yourFunction (int event, int x, int y, int flags, void *param); OpenCV가 넘겨주는 메세지 마우스의 현재 위치를 표현 (x,y) 값은 이미지 좌표계를 기준으로 함 (왼쪽 윗편이 원점) x y (0,0) (8,2)
26
Implementation OpenCV가 넘겨주는 메세지 마우스 및 키보드의 현재 상태 Examples)
void yourFunction (int event, int x, int y, int flags, void *param); OpenCV가 넘겨주는 메세지 마우스 및 키보드의 현재 상태 Event는 마우스가 현재 취하는 동작 Flags는 현재 마우스나 키보드의 상태 Examples) CV_EVENT_FLAG_LBUTTON (왼버튼이 눌린 상태) CV_EVENT_FLAG_RBUTTON (오른버튼이 눌린 상태) CV_EVENT_FLAG_MBUTTON (중간버튼이 눌린 상태) CV_EVENT_FLAG_CTRLKEY (콘트롤키가 눌린 상태) CV_EVENT_FLAG_SHIFTKEY (쉬프트키가 눌린 상태) CV_EVENT_FLAG_ALTKEY (알트키가 눌린 상태)
27
등록(Registration) void cvSetMouseCallback(window_name, yourFunction) 어떤 창(window_name)에 마우스에 변화가 생기면 특정 작업(yourFunction)을 수행하라. Example) cvSetMouseCallback( “test”, on_mouse); “test”라는 창에서 마우스가 움직이면 on_mouse라는 함수를 호출하라
28
코딩연습 마우스에 변화가 생기면 그 때 마우스의 좌표를 출력하라 1. 구현( Implement your )
void myMouse(int event, int x, int y, int flags, void * param) { printf(“mouse: %d %d \n”, x, y); } 2. main() 함수 내에 등록(registration) cvSetMouseCallback(“test”, myMouse);
29
Coding Practice 마우스 왼쪽버튼을 누른 곳에 검은 점을 찍으라 1. 구현( Implement your )
void myMouse(int event, int x, int y, int flags, void * param) { if(event == CV_EVENT_LBUTTONDOWN) cvSet2D(img, y, x, CV_RGB(0,0,0)); cvShowImage(“test”, img); } 2. main() 함수 내에 등록(registration) cvSetMouseCallback(“test”, myMouse);
30
팔렛트 만들기 마우스 클릭 한 곳의 색 알아내기 구현부(Implement)
void myMouse2(int event, int x, int y, int flags, void * param) { if(event == CV_EVENT_LBUTTONDOWN) s = cvGet2D(img, y, x); }
31
OpenCV를 이용한 도형 그리기 OpenCV에서 마우스 사용하기
32
선 그리기 pt1 부터 pt2 까지 주어진 두깨로 선을 그린다 점의 위치를 표현하는 구조체: CvPoint:
void cvLine( IplImage, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1); pt1 부터 pt2 까지 주어진 두깨로 선을 그린다 점의 위치를 표현하는 구조체: CvPoint: cvPoint(x,y) 함수를 사용하면 쉽게 쓸 수 있다 예) (0,0)부터 (100,100)까지 검은 선분을 그리는 명령 struct CvPoint { int x; // x-coordinate int y; // y-coordinate } cvLine( img, cvPoint(0,0), cvPoint(100,100), CV_RGB(0,0,0), 3);
33
사각형 그리기 pt1를 pt2 모서리로 가지는 사각형을 그린다 pt1 pt2 두께에 -1을 주면 어떻게 될까?
void cvRectangle( IplImage, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1 ) pt1를 pt2 모서리로 가지는 사각형을 그린다 pt1 pt2 두께에 -1을 주면 어떻게 될까?
34
원 그리기 주어진 중심과 반지름을 갖는 원을 그린다 radius center
void cvCircle( IplImage, CvPoint center, int radius, CvScalar color, int thickness=1 ) 주어진 중심과 반지름을 갖는 원을 그린다 radius center
35
코딩연습 마우스의 왼쪽 버튼 클릭하고 드래깅하여 그 크기만큼 사각형을 그리라
마우스의 오른 버튼이 눌린 곳에 반지름 50짜리 원을 그리라 또는 마우스의 오른 버튼을 드래깅하여 그 크기만큼 원을 그리라
Similar presentations