Multimedia Programming 04: 점, 선, 면 Departments of Digital Contents Sang Il Park
Pixel: Picture Element
픽셀(Pixel: Picture Element) 이미지: 색이 다른 점들의 2차원 집합 비트맵(Bitmap)
Pixel의 값 = (위치, 색) x y 위치 : 각 픽셀의 2D 좌표 (Image Coordinate System) 색 : CvScalar (색을 저장하는 구조체) x y (0,0) (8,2)
색 표현 3원색을 통한 색의 정의: 한 점을 표현하는 적색(Red), 녹색(Green), 청색(Blue) 램프의 각각의 밝기로 표현 컬러의 수: 각 램프의 밝기 조절 레벨의 수 또는 픽셀 당 비트 수
색을 저장하는 변수형: CvScalar 4 개 이하의 숫자를 저장할 수 있도록 만든 구조체 val[0]은 blue, val[1]은 green, val[2]는 red 값을 저장 일반적인 값의 범위는 0~255 사이 ( 0~(28-1): 8 bit) (0: 가장 어두움, 255: 가장 밝음) Example) CvScalar s; s.val[0] = 200; (Blue) s.val[1] = 11; (Green) s.val[2] = 123; (Red) struct CvScalar { double val[4]; };
색을 저장하는 변수형: CvScalar 값을 입력해주도록 도와주는 함수: cvScalar(b,g,r) 주의: 대소문자 구별! CvScalar color; color.val[0] = 100; color.val[1] = 200; color.val[2] = 50; ---------------------또는 ------------------- CvScalar color = cvScalar(100,200,50); 주의: 대소문자 구별! 대문자로 시작: 자료형 소문자로 시작: 함수
위치를 저장하는 변수형: CvPoint 2차원 좌표를 저장할 수 있도록 만든 구조체 Example) CvPoint pt; // (100,200) pt.x = 100; pt.y = 200; 값을 입력하게 도와주는 함수: cvPoint (x,y) struct CvPoint { int x; int y; }; CvPoint pt=cvPoint(100,200);
참고: 크기를 저장하는 변수형: CvSize 그림 크기를 저장할 수 있도록 만든 구조체 값을 입력해주도록 도와주는 함수: cvSize(w,h) IplImage 로부터 크기를 얻어오는 함수: cvGetSize struct CvSize { int width; int height; }; CvSize size =cvSize(100,200); CvSize size = cvGetSize(img);
이미지에서 Pixel값으로의 접근 CvScalar cvGet2D (IplImage*, y, x) (x,y)에서의 칼라 값 얻기. Example) CvScalar s; s = cvGet2D(img, 30, 40); void cvSet2D (IplImage*, y, x, CvScalar) (x,y)에서의 칼라 값 변경 Example) CvScalar s = cvScalar(100,0,0); cvSet2D(img, 30, 40, s); 또는 cvSet2D(img, 30, 40, cvScalar(100,0,0)); 주의: 반드시 x,y는 이미지 범위 내부에 있어야함! (image의 width와 height를 정보를 참조할것)
코딩연습 이미지의 일부를 Gray-scale image로 만들기 더 생각해 볼 문제: Gray 이미지: 각 픽셀마다 R, G, B 값이 모두 같은 이미지 칼라 이미지의 각 pixel의 R, G, B 값으로부터 대표값(=평균값)을 얻는다 더 생각해 볼 문제: 이미지의 일부를 흑백 이미지로 만들기
생각해 보기: Sepia image 만들기
새로운 그림을 그릴 순 없을까?
빈 이미지 생성 IplImage* cvCreateImage( CvSize size, int depth, int channels ); 만들 빈 이미지의 크기, 허용 색상수를 설정하여 생성 컬러수: color depth: IPL_DEPTH_8U (각 채널당 8bit) channels: 1,2,3,4 (1=grey, 3=color) Example) IplImage * img; img = cvCreateImage(cvSize(200,100), 8,3); cvSet(image, CvScalar) 이미지를 주어진 색으로 가득 칠한다 Example) cvSet(img, cvScalar(255,255,255));
원본과 같은 크기의 그림을 만들어 이를 변형해 새롭게 만들어 보자 원본과 같은 크기의 그림을 만들어 이를 변형해 새롭게 만들어 보자 원본 이미지: (lena.png) 변형된 이미지 (집에서 풀어볼 것: 제작년 기출문제)
선, 면 (line and face)
Coding Practice: Line Drawing1 Make your own function for drawing a horizontal line: 예) void DrawHLine (IplImage * img, int y, int st, int ed, CvScalar color) (st, y) (ed, y) image
Coding Practice: Line Drawing2 Make your own function for drawing a vertical line: 예) void DrawVLine (IplImage * img, int x, int st, int ed, CvScalar color) (x, st) image (x, ed)
Coding Practice: Line Drawing 3 집에서 생각해 볼 것: 시작점과 끝점을 잇는 라인?: 예) void DrawLine (IplImage * img, int x1, int y1, int x2, int y2, CvScalar color)
Coding Practice: Line Drawing 3 Hint: 직선의 방정식: y = m x + b m: 기울기 b: y 절편
면 (face) Design a function that draws a rectangle (x,y) w Design a function that draws a rectangle 예) void DrawRectangle (IplImage * img, int x, int y, int w, int h, CvScalar color) Don’t forget to make sure a pixel is inside the image 0 <= max_x <= img->width 0 <= max_y <= img->height If done, try to draw 50 random boxes with random colors! h
Do more: Drawing or Painting a circle! radius center
For those who want more OpenCV Official page: http://opencvlibrary.sourceforge.net OpenCV WiKi pape: http://opencv.willowgarage.com/wiki/ A Korean Community: http://www.opencv.co.kr/