Upload
dillon
View
169
Download
0
Embed Size (px)
DESCRIPTION
Multimedia Programming 03: 점 , 선 , 면. Departments of Digital Contents Sang Il Park. Review: OpenCV 초기 세팅. 필요한 디렉토리 세팅 Includes: "C:\ OpenCV-2.3.0 \include" Libraries: "C:\ OpenCV-2.3.0 \lib“ 필요한 라이브러리 파일들 세팅 : opencv_core230.lib opencv_imgproc230.lib opencv_highgui230.lib. - PowerPoint PPT Presentation
Citation preview
Multimedia Programming 03:
점 , 선 , 면Departments of Digital
ContentsSang Il Park
Review: OpenCV 초기 세팅
1. 필요한 디렉토리 세팅– Includes:
• "C:\OpenCV-2.3.0\include"
– Libraries:• "C:\OpenCV-2.3.0\lib“
2. 필요한 라이브러리 파일들 세팅 :– opencv_core230.lib– opencv_imgproc230.lib– opencv_highgui230.lib
Today, we will learn:
• IplImage 구조체• OpenCV 익숙해 지기– 점– 선– 면
HelloCV
#include <opencv2/opencv.hpp>
int main(){
IplImage * img;img = cvLoadImage(“c:\\test.jpg");
cvNamedWindow("HelloCV");cvShowImage("HelloCV", img);
cvWaitKey();
cvDestroyWindow("HelloCV");cvReleaseImage(&img);
return 0;}
http://dasan.sejong.ac.kr/~sipark/class2011/mm/code/hellocv.cpp
• IplImage
• cvLoadImage• cvReleaseImage
• cvNamedWindow
• cvShowImage• cvDestroyWindo
w
• 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;•
구조체 (structure) ?
• 하나의 물건 ( 객체 ) 가 여러 요소로 구성되어 있을때 효율적으로 표현하기
• Example) – 학생 : 이름 , 학번 , 주소 , 전화번호 ,…– 성적 : 국어점수 , 수학점수 , 영어점수 , 총점 , 평균
구조체 : 관련된 정보를 그룹화하여 표현구조체 : 관련된 정보를 그룹화하여 표현
구조체 (structure)
구조체 : 관련된 정보를 그룹화하여 표현구조체 : 관련된 정보를 그룹화하여 표현
학생
이름이름 학번학번 주소주소 전화번호전화번호
구조체 이름
멤버 변수
구조체의 정의
• Example)
struct student{
char name[30];int number;float grade;
};
struct student{
char name[30];int number;float grade;
};
멤버로의 접근
구조체변수이름 .맴버변수이름구조체변수이름 .맴버변수이름
struct score{
int korean;int math;
};
score a;a.korean = 30;a.math = 80;
struct score{
int korean;int math;
};
score a;a.korean = 30;a.math = 80;
Image structure ( 이미지 구조체 )• IplImage (Image Processing Library)• 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 */
};•
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
대기시간을 이용하면 애니메이션을 만들 수 있다 .
• 활용예 ) 두 개 이상의 그림을 교대로 보여줌
Image and Pixel
픽셀 (Pixel: Picture Element)
• 이미지 : 픽셀의 집합• 비트맵 (Bitmap)
픽셀
• 픽셀의 색 : 적색 (Red), 녹색 (Green), 청색(Blue)
• 컬러의 수 픽셀 당 비트 수 ( 밝기 레벨 )
Pixel 의 값 = ( 위치 , 색 )
• 위치 : 각 픽셀의 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]; };
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 를 정보를 참조할것 )주의 : 반드시 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!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);
}
cvShowImage("HelloCV", img);cvWaitKey();
cvDestroyWindow("HelloCV");cvReleaseImage(&img);
return 0;}
HelloCV2.cpp
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– 예 ) 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!
(x,y) w
h
Do more2!
• Make your own function for drawing any kind of line :– 예 ) void DrawLine
(IplImage * img, int stx, int sty, int edx, int edy, CvScalar color)
image
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/