본문 바로가기

Programming/OpenCV

[OpenCV] cvCreateImage 함수

IplImage *img = cvCreateImage( size, depth, chennal );
 
cvCreateImage는 IplImage 구조체의 메모리를 생성하여 그 포인터를 넘겨 준다.
 
- 첫번째 size는 이미지의 크기이다. ( 가로와 세로의 길이를 입력)
CvSize 구조체를 이용하여 설정  cvCreateImage( cvSize( 가로 길이, 세로 길이 ) ... );
또는 cvGetsize 함수를 이용하여 IplImage 이미지의 크기를 얻어와서 설정할 수 있다.
 
CvSize size = cvGetSize( img );
cvCreateImage( cvGetSize(img), .... );
 
- 두번째 입력 값은 depth 이다. ( 한 이미지를 표현하는 비트의 크기)
일반적으로 한 픽셀은 0~255 값으로 표현하는데 이는 1바이트로 표현
대부분 IplImage 메모리 할당시 주로 1바이트로 생성
( IplImage의 멤버변수 imageData의 타입은 char* 이다. )
주로 IPL_DEPTH_8U 로 값을 설정
 
다음은 레퍼런스에 나온 depth 상수들
 
IPL DEPTH 8U Unsigned 8-bit integer
IPL DEPTH 8S Signed 8-bit integer
IPL DEPTH 16U Unsigned 16-bit integer
IPL DEPTH 16S Signed 16-bit integer
IPL DEPTH 32S Signed 32-bit integer
IPL DEPTH 32F Single-precision floating point
IPL DEPTH 64F Double-precision floating point
 
ex) IPL_DEPTH_32F를 사용하였다 하더라고 내부 값으 float 변수로 설정되는 것은 아니다.

 if( img->depth == IPL_DEPTH_32F || img->nChannels == 64 )
            {
                img->width *= img->depth == IPL_DEPTH_32F ? sizeof(float) : sizeof(double);
                img->depth = IPL_DEPTH_8U;
            }
단지 float가 4바이트 이기 때문에 메모리 할당시 4배 더 잡는다.
그렇기 때문에 만약 IPL_DEPTH_32F로 생성하고 일반적인 방법으로 접근시 ( img->imageData[ i * height + j ] )
 제대로 된 값을 얻을 수 없다. 왜냐하면 IplImage 구조체의 imageData는 char* 이기 때문이다.
 
opencv 함수중에는 이미지 표현방식을 변경시켜주는 함수있다.
( ex : cvConverScale )
 
만약 이미지 정보를 직접 접근하고 싶다고 한다면  포인터를 사용하여 접근하면 된다.
예로 들어 IPL_DEPTH_32F와 같은 경우 float ( 4바이트 ) 로 표현이 되기 때문에
ex)  float *data = (float)img->imageData;
      접근 : data[ i * height + j ];
위와 같이 하면 4바이트 단위로 접근하기 때문에 정확한 값을 얻을 수 있다.
 
- 마지막 nChennal 의 경우는 이미지를 표현하는 채널 갯수
그레이 이미지는 1채널, RGB 컬러 이미지의 경우는 3채널이므로.
1, 3 을 넣거나 특정 이미지의 채널 갯수로 맞추고 싶다면 image->nChennal 로 값을 얻어 올 수 있다.
반응형