OpenCV CvMat 행렬과 함께 많이 사용하는 IplImage의 구조와 접근방법에 대해 정리한다.
인텔 영상 처리 라이브러리(IPL : Image Processing Library)
인텔 영상 처리 라이브러리(IPL : Image Processing Library)
데이터 타입(depth)와 채널의 개수(nChannels)의 차이점에 유의한다.
IplImage에서는 두가지를 서로 개별적으로 처리한다. (Mat에서는 두가지 속성을 한꺼번에 다룬다.)
nChannels의 값은 1,2,3,4 가능
widthStep : 한 행이 실제로 차지하고 있는 바이트 수
imageDataOrigin : IPL_ORIGIN_TL(값) --> 좌상단(0), 좌하단(1)
IplImage 구조체
typedef struct _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);
댓글 없음:
댓글 쓰기