OpenCv라이브러리는 Intel Image Processing Library (IPL)에서 만들어진 IplImage 형식의 이미지를 이용한다.

typedef struct _IplImage
{
    int  nSize;         // IplImage 구조의 크기
    int  ID;            //이미지 헤더의 버젼
    int  nChannels;    // 채널의 갯수

- n채널은 영상에서 color plane이 몇 개인지를 의미한다. 일반적으로 그레이 영상은 싱글, 컬러영상은 3~4개의 채널을 가지고 있다.


    int  alphaChannel; //알파채널의 갯수
    int  depth;         //비트의 픽셀의 깊이

- 이미지의 정보 깊이라고 할 수 있다. 픽셀값의 타입에 관한 정보를 가지고있다. 다음과같이!

 depth 설 명 
IPL_DEPTH_8U 8비트 unsigned 정수 
IPL_DEPTH_8S  8비트 signed 정수
IPL_DEPTH_16U 16비트 unsigned 정수
IPL_DEPTH_16S  16비트 signed 정수 
IPL_DEPTH_32S 32비트 signed 정수
IPL_DEPTH_32F 32비트 단정도 실수
IPL_DEPTH_64F 64비트 배정도 실수


    char colorModel[4]; /* ignored by OpenCV */
    char channelSeq[4]; /* ditto */
    int  dataOrder;     

- 채널 자료의 저장 순서를 의미한다. dataOrder = 0(IPL_DATA_ORDER_PIXEL)이면 인터리브 컬러채널(interleaved color channels)이고, 1이면 분리 컬러채널(separate color channels)을 의미한다. 인터리브 컬러채널은 컬러영상에서 각 화소의 채널 값인 BGR이 저장되고, 다음 화소의 BGR, 그 다음 화소의 BGR채널 순서로 저장되는 방식이다. 분리 컬러채널은 한 채널의 모든 화소가 저장된 후에 다음 채널이 저장되는 방식으로 컬러 값이 저장되는 것을 의미한다.


    int  origin;        //이미지의 방향
- 0이면 왼쪽 상단이 원점 (0,0)이고, 1이면 윈도우즈의 비트맵과 같이 왼쪽 하단이 원점이 된다. 기본값은 0이다.
                           
    int  align;         /* Alignment of image rows (4 or 8).
                           OpenCV ignores it and uses widthStep instead */
    int  width;         //이미지의 가로넓이 ,
    int  height;        //이미지의 세로넓이
    struct _IplROI *roi; //ROI에 대한 포인터
- Region Of Interest(ROI)로 영상에서 관심영역을 의미한다. roi의 자료형인 구조체 IplROI는 아래와 같다.
typedef struct _IplROI
{
  int coi;
  int xOffset;
  int yOffset;
  int width;
  int height;
}IplROI;
coi는 관심채널(channel of interest), xOffset, yOffset, width, height를 사용하여 영상내의 사각영역을 지정한다. roi가 NULL이 아니면 대부분의 OpenCV함수는 지정된 roi 영역에서만 연산을 수행한다. roi가 NULL이면 전체영상이 관심영역이 된다.



    struct _IplImage *maskROI; // ROI를 마스크하기 위한 포인터
    void  *imageId;     /* ditto */
    struct _IplTileInfo *tileInfo; /* ditto */
    int  imageSize;     //바이트에서 유용한크기
    char *imageData;  //이미지 정보에대한 포인터
    int  widthStep;   //바이트에서 정렬된 라인의 크기
- 한 행의 바이트 개수.
    int  BorderMode[4]; /* ignored by OpenCV */
    int  BorderConst[4]; /* ditto */
    char *imageDataOrigin; //정렬되지 않은 이미지 전체에 대한 포인터
IplImage;

정리

IPL과는 다르게 OpenCV에서는 IplImage의 지원에 대해 다음과 같은 몇 가지 제한을 가지고 있다.

- 각 함수들은 depth와 channel의 개수에 대해 제한적으로 지원된다. 예를 들어, 이미지 통계 함수들은 IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_32F의 depth를 가지는 이미지들은 싱글 채널 혹은 3-채널(채널 3개) 이미지만 지원된다. OpenCV에서는 이 단원의 시작 부분에서 언급한 파라미터들만 지원하며 IPL에서는 모든 이미지 형식에 대해 모든 함수에서 지원된다.
- OpenCv는 오로지 interleaved 이미지만 지원한다. planar 이미지는 지원하지 않는다.
- colorModel, channelSeq, BorderMode, BorderConst 필드는 지원되지 않는다.
- align 필드 역시 지원되지 않는다. 그 대신 widthStep으로 width와 align에서 사용하는 재계산을 간단하게나마 대체하여 사용 할 수 있다.
- maskROI와 tileInfo 필드는 반드시 0이어야 한다.
- COI는 극히 제한적으로만 지원된다. 지금은 오로지 이미지 통계 함수들은 0이 아닌 C이 값들만 받아들인다. CvtPixToPlane과 CvtPlaneToPix 함수들을 이용하여 작업하기 바란다.
- 모든 입력과 출력 이미지들의 ROI들은 서로 반드시 일치해야 한다. 예를 들어, Erode 함수의 입력과 출력의 이미지는 같은 크기의 ROI들을 가져야만 한다. IPL에서는 달라도 같은 효과를 줄 수 있지만 말이다.


이러한 모든 제한사항에도 불구하고 OpenCV는 IplImage에서 지원 될 수 있는 일반적인 이미지 형식들은 지원하고 있다. 또한 가능한 IplImage 형식의 일반적인 subset에서 IPL과 함께 제대로 이용될 수 있다.

참고- Opencv코리아, Opencv 프로그래밍

Posted by 아몰라