Multimedia Programming 03: 점, 선, 면 Departments of Digital Contents Sang Il Park
Outline Review OpenCV 익숙해 지기 점 선 면
Review Open CV 설치하기 IplImage
HelloCV IplImage cvLoadImage cvReleaseImage cvNamedWindow cvShowImage http://dasan.sejong.ac.kr/~sipark/class2010/mm/code/ hellocv.cpp #include <cv.h> #include <cxcore.h> #include <highgui.h> int main() { IplImage * img; img = cvLoadImage(“c:\\test.jpg"); cvNamedWindow("HelloCV"); cvShowImage("HelloCV", img); cvWaitKey(); cvDestroyWindow("HelloCV"); cvReleaseImage(&img); return 0; } IplImage cvLoadImage cvReleaseImage cvNamedWindow cvShowImage cvDestroyWindow cvWaitKey
Image structure (이미지 구조체) IplImage (Image Processing Library) typedef struct _IplImage { int nSize; /* size of iplImage struct */ int ID; /* image header version */ int nChannels; int alphaChannel; int depth; /* pixel depth in bits */ char colorModel[4]; char channelSeq[4]; int dataOrder; int origin; int align; /* 4- or 8-byte align */ int width; int height; struct _IplROI *roi; /* pointer to ROI if any */ struct _IplImage *maskROI; /*pointer to mask ROI if any */ void *imageId; /* use of the application */ struct _IplTileInfo *tileInfo; /* contains information on tiling*/ int imageSize; /* useful size in bytes */ char *imageData; /* pointer to aligned image */ int widthStep; /* size of aligned line in bytes */ int BorderMode[4]; /* the top, bottom, left, and right border mode */ int BorderConst[4]; /* constants for the top, bottom,left, and right border */ char *imageDataOrigin; /* ptr to full, nonaligned image */ } IplImage;
Image I/O (이미지 입출력) IplImage* cvLoadImage(image_path); 파일로 부터 이미지를 읽는다. 성공할 경우 메모리가 생성되고 IplImage pointer를 반환 실패할 경우 NULL 값을 리턴 cvSaveImage(image_path, IplImage *); 이미지를 파일로 저장한다. 형식은 확장자로 부터 결정 cvReleaseImage(IplImage **); 이미지를 저장하고 있던 메모리를 해제한다. BMP, JPEG, PNG, TIFF, PPM/PGM 포멧등이 지원됨
Image I/O (이미지 입출력) 이미지의 포멧을 바꾸어 저장하기 예: IplImage* img = cvLoadImage(“picture.jpg”); if( img != NULL ) cvSaveImage( “picture.bmp”, img );
Windows cvNamedWindow(window_name); 윈도우를 생성한다. 윈도우는 이름을 부여할 수 있고, 각 이름을 기준으로 구분한다. cvNamedWindow(“ViewA”); cvMoveWindow(“ViewA”,300,100); cvDestroyWindow(“ViewA”); … cvShowImage(window_name, IplImage *); 주어진 이름에 해당하는 윈도우에 이미지를 보여준다. 한 이미지만을 보여 줄 수 있으며, 부분 적인 출력은 하지 못한다. cvDestroyWindow(window_name); 주어진 이름에 해당하는 윈도우를 없앤다.
User Input int cvWaitKey( int delay=0 ) 사용자가 키를 누르기를 정해진 대기시간 만큼 기다린다. 대기시간이 초과되면 다음 명령을 수행한다. 대기시간으로 0을 설정하면 영원히 기다린다. 시간의 값은 millisecond 대기시간을 이용하면 애니메이션을 만들 수 있다. 활용예) 두 개 이상의 그림을 교대로 보여줌
What else HighGUI can do? “Smart” windows Image I/O, rendering Processing keyboard and other events, timeouts Trackbars Mouse callbacks Video I/O
Image and Pixel
픽셀(Pixel: Picture Element) 이미지:픽셀의 집합 비트맵(Bitmap)
픽셀 픽셀의 색: 적색(Red), 녹색(Green), 청색(Blue) 컬러의 수 픽셀 당 비트 수(밝기 레벨)
Pixel의 값 = (위치, 색) x y 위치 : 각 픽셀의 2D 좌표 (Image Coordinate System) 색 : CvScalar (색을 저장하는 구조체) x y (0,0) (8,2)
색을 저장하는 변수: CvScalar 4 개 이하의 숫자를 저장할 수 있도록 만든 구조체 0번은 blue, 1번은 green, 2번은 red 값을 저장 Example) CvScalar s; s.val[0] = 200; (Blue) s.val[1] = 11; (Green) s.val[2] = 123; (Red) struct CvScalar { double val[4]; };
이미지에서 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, CV_RGB(255,255,255));
So far what you’ve learned: IplImage cvLoadImage (file_name) cvCreateImage (size, depth, channels) cvSaveImage (file_name, image) cvReleaseImage (image) cvNamedWindow (window_name) cvShowImage (window_name, image) cvDestroyWindow (window_name) cvWaitKey (delay) cvGet2D (image, y, x) cvSet2D (image, y, x, cvScalar)
Put everything together! HelloCV2.cpp int main() { IplImage * img; img = cvLoadImage(“c:\\test.jpg"); cvNamedWindow("HelloCV"); cvShowImage("HelloCV", img); cvWaitKey(); int x,y; for(x=0; x<100; x++) for(y=0; y<100; y++) CvScalar s = cvGet2D(img, y,x); s.val[0] +=50; s.val[1] +=50; s.val[2] +=50; cvSet2D(img,y,x,s); } cvDestroyWindow("HelloCV"); cvReleaseImage(&img); return 0;
Coding Practice: Line Drawing Make your own function for Horizontal line drawing: 예) void DrawHLine (IplImage * img, int y, int st, int ed, CvScalar color) image
Do more! 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
For those who want more OpenCV Wiki-pages: http://opencvlibrary.sourceforge.net For HighGUI: http://opencvlibrary.sourceforge.net/HighGui For cxcore: http://opencvlibrary.sourceforge.net/CxCore Supplied documentation: OpenCV/docs/index.htm, faq.htm A Korean Community: http://www.opencv.co.kr/
Program Assignment #1 Long long times ago in Russian Empire Sergei Mikhailovich Prokudin-Gorskii (1863-1944) A man who pursuing a colorful future in 1907 http://www.loc.gov/exhibits/empire/
Program Assignment #1 His invention A camera His camera
Program Assignment #1 His pictures with the current digital technology
Program Assignment #1 Recover the colorful world in 1907 by yourself! align G R
Program Assignment #1 홈페이지에 4개의 예제 그림이 있음: http://dasan.sejong.ac.kr/~sipark/class2010/mm/ 숙제 기한: Sep.17 PM 23:59 (금요일) Email 제출 : sipark@sejong.ac.kr Report ( doc, hwp, pdf) Source code (cpp 파일) 복수개의 파일(h 파일 포함)이 필요 하다면 첨부할 것 점수: 주석 및 리포트: 20 Color 이미지가 나온다: 40 자동으로 그림이 맞추어 진다: 40
연습시간 매주 화요일 저녁 6시 단, 오늘은 6시 30분