반응형

출처 : http://cafe.naver.com/opencv/920

>opencv에 face detect c로된 샘플예제에서

>if( frame->origin == IPL_ORIGIN_TL )

>요구문에 대한 이해가 되질않습니다.

>origin과 IPL_ORIGN_TL은 각각 무엇인질 모르겠습니다. 아시는분은 자세히 설명좀 부탁드려요

>해당 부분이 포함된 소스입니다.

>if( capture )
    {
        for(;;)
        {
            if( !cvGrabFrame( capture ))
                break;
            frame = cvRetrieveFrame( capture );
            if( !frame )
                break;
            if( !frame_copy )
                frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
                                            IPL_DEPTH_8U, frame->nChannels );
      if( frame->origin == IPL_ORIGIN_TL )
                cvCopy( frame, frame_copy, 0 );
            else
                cvFlip( frame, frame_copy, 0 );
           
            detect_and_draw( frame_copy );

>            if( cvWaitKey( 10 ) >= 0 )
                break;
        }

>


OpenCV를 설치할때 같이 설치 되는 레퍼런스를 보시면 쉽게 찾으실 수 있습니다.


일단 cvRetrieveFrame 함수부터 보시면


cvRetrieveFrame

Gets the image grabbed with cvGrabFrame

IplImage* cvRetrieveFrame( CvCapture* capture );
capture
video capturing structure.

The function cvRetrieveFrame returns the pointer to the image grabbed with cvGrabFrame function. The returned image should not be released or modified by user.


보시다 시피 이 함수는 cvGrabFrame 으로 부터 받은 프레임을 IplImage* 형으로 변환해 주는 함수입니다.


위 소스에서는 frame = cvRetrieveFrame( capture ); 부분에서 frame 이란 변수에 저장시키고 있습니다. (물론 frame 은 IplImage*형이겠죠)



이쯤되면 눈치 채셨겠지만  if( frame->origin == IPL_ORIGIN_TL ) 이 소스부분의 frame->origin 은 IplImage


구조체의 멤버변수입니다.

IplImage

IPL image header

    typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) */
int ID; /* version (=0)*/
int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */
int alphaChannel; /* ignored by OpenCV */
int depth; /* pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported */
char colorModel[4]; /* ignored by OpenCV */
char channelSeq[4]; /* ditto */
int dataOrder; /* 0 - interleaved color channels, 1 - separate color channels.
cvCreateImage can only create interleaved images */
int origin; /* 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style) */
int align; /* Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead */
int width; /* image width in pixels */
int height; /* image height in pixels */
struct _IplROI *roi;/* image ROI. when it is not NULL, this specifies image region to process */
struct _IplImage *maskROI; /* must be NULL in OpenCV */
void *imageId; /* ditto */
struct _IplTileInfo *tileInfo; /* ditto */
int imageSize; /* image data size in bytes
(=image->height*image->widthStep
in case of interleaved data)*/
char *imageData; /* pointer to aligned image data */
int widthStep; /* size of aligned image row in bytes */
int BorderMode[4]; /* border completion mode, ignored by OpenCV */
int BorderConst[4]; /* ditto */
char *imageDataOrigin; /* pointer to a very origin of image data
(not necessarily aligned) -
it is needed for correct image deallocation */
}
IplImage;
구조체 정의를 보시면 origin 이란 멤버가 이미지 시작의 포인터를 뜻한다는걸 알 수 있습니다.
끝을 맺자면 IPL_ORIGIN_TL는 TL(Top Left)의 약자를 뜻하며 왼쪽 상단이 이미지의 시작부분임을 알 수 있구요.
cvFlip( frame, frame_copy, 0 ); 이 부분은 origin 이 Top Left가 아닐때는 cvFlip 함수 레퍼런스를 참고하시면 마지막
파라미터인 0은 flip_mode = 0 means flipping around x-axis, << flip_mode 이며 0일때, x축에 대해서 뒤짚으란
의미가 됩니다. 결국에 origin 이 Top Left가 아니고 BL(Bottom Left) 라면 뒤짚어서 frame_copy에 저장하라는 의미가 되겠죠
이상입니다. 도움이 되셨길 바랍니다^^
반응형

'멀티미디어' 카테고리의 다른 글

OpenCV 에서 사용할 수 있는 것들  (0) 2008.06.21
MPEG transport stream  (0) 2008.06.14
The Fourier Transform  (0) 2008.06.14
Posted by Real_G