Transcript
Page 1: Multimedia Programming 19: Mouse with OpenCV

Multimedia Programming 19:

Mouse with OpenCVDepartments of Digital

ContentsSang Il Park

Page 2: Multimedia Programming 19: Mouse with OpenCV

Mouse Callback in OpenCV

OpenCV 에서 마우스 사용하기

Page 3: Multimedia Programming 19: Mouse with OpenCV

Mouse

With OPENCV

Page 4: Multimedia Programming 19: Mouse with OpenCV

Keyboard With OPENCV

int cvWaitKey(interval)

Page 5: Multimedia Programming 19: Mouse with OpenCV

Mouse With OPENCV

cvSetMouseCallback(…)

Page 6: Multimedia Programming 19: Mouse with OpenCV

Mouse Callback?• 콜백 함수 (Callback):

– 특정 함수가 어떤 함수의 인자로서 사용될 때 이 함수를 콜백 함수라고 한다 .

• 마우스 콜백 (mouse callback):– 마우스의 상태에 변화가 생겼을 때 불리는 함수– 예시 )

• 마우스가 움직인다• 왼 ( 오른 ) 버튼이 눌리고 있음 ( 올라가고 있음 ), 더블클릭 ,

Page 7: Multimedia Programming 19: Mouse with OpenCV

마우스 콜백 사용하기• OpenCV 에서는 사용자가 임의의 함수를 만들고

이를 마우스에 변화가 생겼을 때 호출되게 할 수 있다 .

• 이를 위해서는 다음 2 가지 일을 하여야 한다 :1. 구현 (Implementation)

• 마우스에 변화가 생겼을 때 무엇을 할 것인가 ? 를 정의함 .

2. 등록 (Registration)• 위에 정의한 함수를 opencv 에게 사용하겠다고 등록시킴 .

void cvSetMouseCallback(window_name, yourFunction)

void yourFunction (int event, int x, int y, int flags, void *param);

Page 8: Multimedia Programming 19: Mouse with OpenCV

구현 (Implementation)

• 함수의 이름은 자유롭게 지을 수 있다• 예 ) on_mouse(..), myMouse(…), …

• 입력 인자들은 OpenCV 가 알려주는 것으로 마우스에 어떤 변화가 생겼는 지 알려주는 정보가 담겨있다 .

void yourFunction (int event, int x, int y, int flags, void *param);

Page 9: Multimedia Programming 19: Mouse with OpenCV

Implementation

• OpenCV 가 넘겨주는 메세지• 어떤 마우스 관련 이벤트 종류인지 알려줌• Examples)

CV_EVENT_MOUSEMOVE ( 마우스가 움직임 )CV_EVENT_LBUTTONDOWN ( 왼쪽버튼이 눌리고 있음 )CV_EVENT_RBUTTONDOWN ( 오른버튼이 눌리고 있음 )CV_EVENT_MBUTTONDOWN ( 중간버튼이 눌리고 있음 )CV_EVENT_LBUTTONUP ( 왼쪽버튼이 올라가고 있음 ) CV_EVENT_RBUTTONUP ( 오른버튼이 올라가고 있음 )CV_EVENT_MBUTTONUP ( 중간버튼이 올라가고 있음 )

void yourFunction (int event, int x, int y, int flags, void *param);

Page 10: Multimedia Programming 19: Mouse with OpenCV

Implementation

• OpenCV 가 넘겨주는 메세지• 마우스의 현재 위치를 표현 (x,y)• 값은 이미지 좌표계를 기준으로 함

( 왼쪽 윗편이 원점 )

y (0,0)(8,2)

x

void yourFunction (int event, int x, int y, int flags, void *param);

Page 11: Multimedia Programming 19: Mouse with OpenCV

Implementation

• 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 ( 알트키가 눌린 상태 )

void yourFunction (int event, int x, int y, int flags, void *param);

Page 12: Multimedia Programming 19: Mouse with OpenCV

등록 (Registration)

• 어떤 창 (window_name) 에 마우스에 변화가 생기면 특정 작업 (yourFunction) 을 수행하라 .

• Example)cvSetMouseCallback( “test”, on_mouse); “test” 라는 창에서 마우스가 움직이면 on_mouse 라는 함수를 호출하라

void cvSetMouseCallback(window_name, yourFunction)

Page 13: Multimedia Programming 19: Mouse with OpenCV

코딩연습• 마우스에 변화가 생기면 그 때 마우스의 좌표를

출력하라

1. 구현 ( Implement your )

2. main() 함수 내에 등록 (registration)

void myMouse(int event, int x, int y, int flags, void * param){

printf(“mouse: %d %d \n”, x, y);}

cvSetMouseCallback(“test”, myMouse);

Page 14: Multimedia Programming 19: Mouse with OpenCV

Coding Practice• 마우스 왼쪽버튼을 누른 곳에 검은 점을 찍으라

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);

}}

1. 구현 ( Implement your )

2. main() 함수 내에 등록 (registration)

cvSetMouseCallback(“test”, myMouse);

Page 15: Multimedia Programming 19: Mouse with OpenCV

팔렛트 만들기• 마우스 클릭 한 곳의 색 알아내기

void myMouse2(int event, int x, int y, int flags, void * param){

if(event == CV_EVENT_LBUTTONDOWN){

s = cvGet2D(img, y, x);}

}

구현부 (Implement)

Page 16: Multimedia Programming 19: Mouse with OpenCV

OpenCV 를 이용한 도형 그리기

OpenCV 에서 마우스 사용하기

Page 17: Multimedia Programming 19: Mouse with OpenCV

선 그리기void cvLine( IplImage, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1);

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-coordinateint y; // y-coordinate

}

struct CvPoint{

int x; // x-coordinateint y; // y-coordinate

}

cvLine( img, cvPoint(0,0), cvPoint(100,100), CV_RGB(0,0,0), 3); cvLine( img, cvPoint(0,0), cvPoint(100,100), CV_RGB(0,0,0), 3);

Page 18: Multimedia Programming 19: Mouse with OpenCV

사각형 그리기void cvRectangle( IplImage, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1 )

void cvRectangle( IplImage, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1 )

• pt1 를 pt2 모서리로 가지는 사각형을 그린다

pt1

pt2

두께에 -1 을 주면 어떻게 될까 ?

Page 19: Multimedia Programming 19: Mouse with OpenCV

원 그리기void cvCircle( IplImage, CvPoint center, int radius, CvScalar color, int thickness=1 )

void cvCircle( IplImage, CvPoint center, int radius, CvScalar color, int thickness=1 )

• 주어진 중심과 반지름을 갖는 원을 그린다

centerradius

Page 20: Multimedia Programming 19: Mouse with OpenCV

코딩연습1. 마우스의 왼쪽 버튼 클릭하고 드래깅하여 그

크기만큼 사각형을 그리라

2. 마우스의 오른 버튼이 눌린 곳에 반지름 50 짜리 원을 그리라

또는

마우스의 오른 버튼을 드래깅하여 그 크기만큼 원을 그리라

Page 21: Multimedia Programming 19: Mouse with OpenCV

Topics for the Term Project

Page 22: Multimedia Programming 19: Mouse with OpenCV

Feature based Image Metamorphosis

• Thaddeus Beier and Shawn Neely, “Feature-Based Image Metamorphosis “, SIGGRAPH 1992

Page 23: Multimedia Programming 19: Mouse with OpenCV

Image Deformation

• S. Schaefer, T. McPhail, J. Warren, “Image Deformation Using Moving Least Squares”, SIGGRAPH 2006

Page 24: Multimedia Programming 19: Mouse with OpenCV

Texture synthesis

• A. A. Efros and T. K. Leung, "Texture Synthesis by Non-parametric Sampling", ICCV 99

• Wei and Levoy, “Fast Texture Synthesis using Tree-structured Vector Quantization “, SIGGRAPH 2000

Page 25: Multimedia Programming 19: Mouse with OpenCV

Image Analogy

• A. Hertzmann, C. Jacobs, N. Oliver, B. Curless, D. Salesin, “Image Analogy”,SIGGRAPH 2001

Page 26: Multimedia Programming 19: Mouse with OpenCV

Colorization

• Tomihisa Welsh, Michael Ashikhmin, and Klaus Mueller, ”Transferring color to grayscale images”, SIGGRAPH 2002

Page 27: Multimedia Programming 19: Mouse with OpenCV

Image Blending

• Patrick Perez, Michel Gangnet, Andrew Blake, “Poisson Image Editing”, SIGGRAPH 2003

• http://www.cs.tau.ac.il/~tommer/adv-graphics/ex1.htm

source images Poisson seamless cloning

Page 28: Multimedia Programming 19: Mouse with OpenCV

Matting

• J. Sun, J. Jia, C. Tang, H. Shum, “Poisson Matting”, SIGGRAPH 2004

source image opacityextracted

foreground objectimage

composition

Page 29: Multimedia Programming 19: Mouse with OpenCV

Content-Aware Image Resizing

• Shai Avidan, Ariel Shamir, “Seam Carving for Content-Aware Image resizeing”, SIGGRAPH 2006

• http://www.seamcarving.com/

source image resized image

Page 30: Multimedia Programming 19: Mouse with OpenCV

Painterly Rendering

• Aaron Hertzmann, "Painterly Rendering with Curved Brush Strokes of Multiple Sizes“, SIGGRAPH 1998

Page 31: Multimedia Programming 19: Mouse with OpenCV

Painterly Rendering2

• Michio Shiraishi and Yasushi Yamaguchi , “Image Moment-Based Stroke Placement”, ACM SIGGRAPH 99 Conference abstracts and applications, 1999

Page 32: Multimedia Programming 19: Mouse with OpenCV

High Dynamic Range Compression

• Raanan Fattal, Dani Lischinski, Michael Werman,“Gradient Domain High Dynamic Range Compression”, ACM SIGGRAPH 2002