2017년 2월 15일 수요일

OpenCV IplImage

OpenCV CvMat 행렬과 함께 많이 사용하는 IplImage의 구조와 접근방법에 대해 정리한다.


인텔 영상 처리 라이브러리(IPL : Image Processing Library)

데이터 타입(depth)와 채널의 개수(nChannels)의 차이점에 유의한다.
IplImage에서는 두가지를 서로 개별적으로 처리한다. (Mat에서는 두가지 속성을 한꺼번에 다룬다.)

nChannels의 값은 1,2,3,4 가능

widthStep : 한 행이 실제로 차지하고 있는 바이트 수
imageDataOrigin : IPL_ORIGIN_TL(값) --> 좌상단(0), 좌하단(1)

 
IplImage 구조체

typedef struct _IplImage {
  int                  nSize;
  int                  ID;
  int                  nChannels;
  int                  alphaChannel;
  int                  depth;
  char                 colorModel[4];
  char                 channelSeq[4];
  int                  dataOrder;
  int                  origin;
  int                  align;
  int                  width;
  int                  height;
  struct _IplROI*      roi;
  struct _IplImage*    maskROI;
  void*                imageId;
  struct _IplTileInfo* tileInfo;
  int                  imageSize;
  char*                imageData;
  int                  widthStep;
  int                  BorderMode[4];
  int                  BorderConst[4];
  char*                imageDataOrigin;
} IplImage;


void saturate_sv( IplImage* img ) {

  for( int y = 0; y < img->height; y++ )
  {
    uchar* ptr = (uchar*)(img->imageData + y * img->widthStep);
    for( int x=0; x < img->width; x++ ) {
      ptr[3 * x + 1] = 255;
      ptr[3 * x + 2] = 255;
    }
  }
}

int main( int argc, char** argv )
{
  IplImage* img = cvLoadImage( argv[1] ); // 3채널 이미지
  cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE );
  saturate_sv(img);
  cvShowImage("Example1", img );
  cvWaitKey(0);
  cvReleaseImage( &img );
  cvDestroyWindow("Example1");
}

IplImage 구조체의 imageData와 CvMat 구조체의 data 멤버 변수를 이용하여 실제 데이터에 접근하는 방법에는 큰 차이점이 있다.
CvMat 구조체의 data 원소는 어떤 타입의 포인터로 접근할것인지 명시가 필요하다.
imageData는 바이트 타입의 포인터(uchar*)이다.

  IplImage* img_rgb  = cvLoadImage( argv[1] );
  IplImage* img_gry  = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, 1);

  cvNamedWindow("Example Gray", CV_WINDOW_AUTOSIZE );

  cvShowImage("Example Gray", img_gry );

  cvDestroyWindow("Example Gray");

  cvReleaseImage( &img_rgb);
  cvReleaseImage( &img_gry);














댓글 없음:

댓글 쓰기