OpenCV 카메라 뒤집어 지는 문제
출처 : 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 |