'프로그래밍 기초 > 영상처리' 카테고리의 다른 글
얼굴인식의 역사, 이슈, 알고리즘, Process flow, 기본적인 기술 비교 (1) | 2011.11.06 |
---|---|
이진화하기 (0) | 2011.11.02 |
마우스 이벤트 (0) | 2011.10.31 |
키보드 이벤트 처리 (0) | 2011.10.30 |
문자 출력 (1) | 2011.10.30 |
얼굴인식의 역사, 이슈, 알고리즘, Process flow, 기본적인 기술 비교 (1) | 2011.11.06 |
---|---|
이진화하기 (0) | 2011.11.02 |
마우스 이벤트 (0) | 2011.10.31 |
키보드 이벤트 처리 (0) | 2011.10.30 |
문자 출력 (1) | 2011.10.30 |
Automatic Face Recognition of Behavioral or Physiological Characteristicin Human Body |
|
|
|
|
|
얼굴을 인식하는 기술은 매우 복잡하고 변수가 많은 기술로서 이의 소프트웨어적인 개발도 최근에 이르러서야 이루어졌습니다. 먼저 카메라가 얼굴의 이미지를 잡으면 소프트웨어가 이를 템플릿(Templates)과 비교하는 것으로 얼굴인식기술은 지칭될 수 있습니다. |
||
얼굴인식의 근간을 이루는 기술은 두 가지로 구분되어지는데 첫번째는 얼굴의 각 구성요소의 특징값과 상호관계- 예컨대 코 길이와 눈으로부터의 거리 등을 비교하는 것이고 두번째는 얼굴의 가장 중요한 이미지 데이터- 예컨대 코의 크기등- 를 데이터베이스에 저장되어 있는 얼굴의 데이터와 비교, 매칭시키는 방법입니다. 이러한 얼굴인식 기술은 여타 생체인식 기술에 비하여 다음과 같은 특징을 가지고 있습니다. | ||
생체인식의 기본 입력테이터가 되는 생체 특성값을 카메라를 통하여 얻게 되므로 근접식 또는 접촉식 기술보다 비교적 먼 거리에서 동작될 수 있습니다. (Recognized in a distance) | ||
인식의 속도가 비교적 빠릅니다. (Relatively high recognition speed) | ||
다수 중에서 특정의 값을 가지는 데이터를 찾을 수 있습니다. (Enough to conduct 1 - to - many searches) | ||
기술의 종류 | ||
얼굴의 기학적인 특징을 이용한 인식기술 (Geometrical feature analysis) | ||
눈, 코, 입과 같은 얼굴의 특징점들의 위치나 크기 또는 이들간의 거리와 같은 기하학적 인자들만으로도 각 개개인의 얼굴을 인식할 수 있다는 사실에 착안한 것으로서 이들 기하학적 특징들은 입력화상의 해상도를 낮추었을 때 최종적으로 남는 요소들에 해당합니다. 이는 얼굴인식에서 가장 보편적으로 이용하는 방법론입니다. | ||
Eigenface를 이용한 방법(Eigenface approach) | ||
Eigenface란 '고유얼굴'이라는 의미를 가지는데 이는 MIT대학의 Sirovich와 Kirby에 의해 제안된 방법입니다. 사람얼굴을 저차원격으로 표현(Low - dimentional representation)할 수 있도록 하여 얼굴이미지의 기본요소를 분석(Principal components analysis)할 수 있도록 한 것인데 이 기본요소란 얼굴이미지의 변화를 나타내는 일련의 특징들을 의미하는 것으로 수학적으로 표현하면 하나의 얼굴 이미지군을 나타내는 공변(共變) 행렬(Covariance matrix)의 Eigenvector를 의미합니다. 먼저 위 기본요소들에 입력된 얼굴이미지를 투영시킨 후 이들을 저장된 얼굴이미지의 투영체와 비교하거나 상관시켜 특징들을 추출합니다. 이 추출된 특징들을 'Eigenface'또는 'Holon'이라고 하는데 이것을 가중치를 적용한 다중 템플릿 매칭방법으로 분류할 수 있는 것입니다. | ||
템플릿 매칭을 이용한 방법(Template matching approach) | ||
이는 얼굴이미지를 얼굴 전체를 나타내는 하나의 템플릿 화상과 비교하여 이에 따른 상관도를 분석함으로써 얼굴을 인식하는 방법론입니다. | ||
인공신경망을 이용한 학습형 인식방법(Neural network mapping approach) | ||
이미 여러분야에서 활용되고 있는 신경망 기술을 얼굴인식분야에 접목시킨 것으로서 통계적 분석을 기반으로 하는 신경망의 학습 및 인식기능을 이용하여 얼굴을 인식하는 방법으로 오늘날 가장 큰 비중을 차지하고 있는 방법입니다. |
Haar분류기에 대한 정보 (0) | 2011.11.16 |
---|---|
이진화하기 (0) | 2011.11.02 |
마우스 이벤트 (0) | 2011.10.31 |
키보드 이벤트 처리 (0) | 2011.10.30 |
문자 출력 (1) | 2011.10.30 |
중요함수
1.
2.
Color 변환모드
CV_RGB2GRAY - 흑백으로 변환
CV_RGB2YCrCb - 주로 Skin Color 모델을 할 때 변환
CV_RGB2HLS - H(Hue색상), L(Luminance,휘도),S(Saturation,채도)
CV_RGB2HSV - 모든 컬러를 Hue, Saturation, Value로 표현하는 방식
CV_RGB2Lab - L은 밝기인 명도, a 조합은 녹색에서 적색의 보색 b 조합은 황색에서 청색의 보색
CV_RGB2Luv - CIE Yxy색표계에서 지각적 등보성을 보완한 색 공간
결과
[참고] OpenCV 강좌 04. 영상 이진화 하기 (OpenCV KOREA 대한민국 최고의 컴퓨터비젼 커뮤니티)
Haar분류기에 대한 정보 (0) | 2011.11.16 |
---|---|
얼굴인식의 역사, 이슈, 알고리즘, Process flow, 기본적인 기술 비교 (1) | 2011.11.06 |
마우스 이벤트 (0) | 2011.10.31 |
키보드 이벤트 처리 (0) | 2011.10.30 |
문자 출력 (1) | 2011.10.30 |
cVSetMouseCallback 함수로 이벤트 핸들러 함수를 지정하고, 핸들러 함수에서 이벤트를 처리한다.
window_name = 이벤트를 발생시킬 윈도우의 이름을 적는다.
on_mouseEvent = 마우스 이벤트를 처리할 핸들러 함수를 적는다. 함수명은 사용자가 임의로 정해도된다. 단, 인수의 자료형과 의미는 미리 정해져있다.
param = 핸들러 함수로 전달될 사용자 정의 인수이다.
이렇게 인수가 정해져있다.
event = 마우스 이벤트
flags = 마우스 이벤트가 발생했을 때 마우스 버튼, CTRL, SHIFT, ALT 키를 눌렀는지 확인하기 위해 사용된다.
param = 사용자 정의 인수
마우스 이벤트(event)상수
마우스 flags 상수
예제 소스
#include "stdafx.h"
#include <cv.h>
#include <highgui.h> // 키보드 마우스 트랙바 이벤트 처리 기능을 갖는 사용자 인터페이스 함수를 지원한다.
void on_eventhandle(int event, int x, int y, int flags, void* param);
int main()
{
IplImage *dstImage;
dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
cvSet(dstImage, CV_RGB(255, 255, 255));
cvNamedWindow("Mouse Event Handling", CV_WINDOW_AUTOSIZE);
cvShowImage("Mouse Event Handling", dstImage);
cvSetMouseCallback("Mouse Event Handling", on_eventhandle, (void *)dstImage);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&dstImage);
return 0;
}
void on_eventhandle (int event, int x, int y, int flags, void* param) //핸들러 함수
{
IplImage *image;
image = (IplImage *)param;
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
if(flags & CV_EVENT_FLAG_SHIFTKEY) // 쉬프트를 누르고 클릭시 네모
cvRectangle(image, cvPoint(x-5, y-5), cvPoint(x+5, y+5), CV_RGB(255, 0, 0));
else //아니면 원
{
cvCircle(image, cvPoint(x, y), 5, CV_RGB(0, 0, 255), 5);
}
break;
case CV_EVENT_RBUTTONDOWN:
cvCircle(image, cvPoint(x, y), 5, CV_RGB(255, 0, 0), 5);
break;
}
cvShowImage("Mouse Event Handling", image);
}
참조 - OpenCv 프로그래밍
얼굴인식의 역사, 이슈, 알고리즘, Process flow, 기본적인 기술 비교 (1) | 2011.11.06 |
---|---|
이진화하기 (0) | 2011.11.02 |
키보드 이벤트 처리 (0) | 2011.10.30 |
문자 출력 (1) | 2011.10.30 |
선, 사각형, 원, 타원 그리기 (0) | 2011.10.30 |
void main()
{
IplImage *dstImage;
dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
cvSet(dstImage, CV_RGB(255, 255, 255));
cvNamedWindow("키보드이벤트", CV_WINDOW_AUTOSIZE);
cvShowImage("키보드이벤트", dstImage);
int nKey = 0;
while(1)
{
nKey = cvWaitKey(0);
//cvWaitKey 함수는 delay <= 0 이면 키보드에서 키가 눌러질 때 까지 무한히 기다린다.
printf("입력하시오 : %x\n", nKey);
if(nKey == 0x1B) //ESC이면 반환한다.
break;
}
cvDestroyAllWindows();
cvReleaseImage(&dstImage);
}
기본 문자를 출력하고 문자의 정확한 사이즈를 재보고 그것을 활용한다!
void main()
{
IplImage *dstImage;
dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
cvSet(dstImage, CV_RGB(255, 255, 255));
CvFont font; //폰트변수 생성
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0); //폰트 초기화
cvPutText(dstImage, "OpenCV Programming", cvPoint(100, 100), &font,
CV_RGB(0, 0, 0) ); //폰트 그림에 삽입
CvSize text_size; //폰트 사이즈를 저장해놓기 위한!
int baseline;
cvGetTextSize( "OpenCV Programming", &font, &text_size, &baseline );
//폰트 사이즈 가져오기 baseline은 기준선에서 가장 아래 떨어진 글자에 대한 y좌표의 상대적 거리를 가져온다.
cvRectangle(dstImage, cvPoint(100, 100), cvPoint(100+text_size.width,
100-text_size.height), CV_RGB(255, 0, 0));
//가져온 폰트사이즈를 토대로 글씨에 사각형을 그린다.
cvNamedWindow("Drawing Graphics", CV_WINDOW_AUTOSIZE);
cvShowImage("Drawing Graphics", dstImage);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&dstImage);
}
마우스 이벤트 (0) | 2011.10.31 |
---|---|
키보드 이벤트 처리 (0) | 2011.10.30 |
선, 사각형, 원, 타원 그리기 (0) | 2011.10.30 |
카메라 입력받기 (0) | 2011.10.30 |
파일에서 영상읽기 및 화면에 출력하기 (0) | 2011.10.30 |
void main()
{
IplImage *dstImage;
dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3); //3채널 컬러 영상 생성
cvSet(dstImage, cvScalarAll(255));
// cvSet(dstImage, CV_RGB(255, 255, 255)); 모든 화소값을 흰색으로 변경 위에 cvScalarAll도 마찬가지!
cvRectangle(dstImage, cvPoint(100, 100), cvPoint(400, 400), CV_RGB(255, 0, 0));
cvLine(dstImage, cvPoint(400, 100), cvPoint(100, 400), CV_RGB(0, 255, 0));
cvLine(dstImage,cvPoint(400, 100), cvPoint(100, 400), CV_RGB(0, 255, 0), 2, 8, 1);
// cvLine(dstImage,cvPoint(400/2, 100/2),cvPoint(100/2, 400/2), CV_RGB(0, 255, 0), 2); 선그리기
cvRectangle(dstImage, cvPoint(400/2, 100/2), cvPoint(100/2, 400/2), //사각형
CV_RGB(0, 0, 255));
cvCircle(dstImage, cvPoint(250, 250), 150, CV_RGB(0, 0, 250)); //원
cvEllipse(dstImage, cvPoint(400, 400), cvSize(100, 50), 45, 0, 360, //타원
CV_RGB(255, 0, 0));
cvNamedWindow("Drawing Graphics", CV_WINDOW_AUTOSIZE);
cvShowImage("Drawing Graphics", dstImage);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&dstImage);
}
키보드 이벤트 처리 (0) | 2011.10.30 |
---|---|
문자 출력 (1) | 2011.10.30 |
카메라 입력받기 (0) | 2011.10.30 |
파일에서 영상읽기 및 화면에 출력하기 (0) | 2011.10.30 |
IplImage 구조체 (0) | 2011.10.29 |
- 소스 코드(압축 파일 첨부)
#include <cv.h>
#include <highgui.h>
void main()
{
IplImage* image = 0;
CvCapture* capture = cvCaptureFromCAM(0);
cvNamedWindow( "T9-camera", 0 );
cvResizeWindow( "T9-camera", 320, 240 );
while(1) {
cvGrabFrame( capture );
image = cvRetrieveFrame( capture );
cvShowImage( "T9-camera", image );
if( cvWaitKey(10) >= 0 )
break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "T9-camera" );
}
- 소스 설명
일단 OpenCV 를 사용하기 위하여 영상처리 관련 라이브러리를 사용하기 위해 <cv.h> 를 include 하고 영상을 캡쳐 받고 윈도우로 보여주기 위해 <highgui.h> 를 include 하지만 사실 카메라 영상만 입력 받아 화면에 보여줄 것이라면 <highgui.h> 만 include 해도 됩니다.
#include <cv.h> // 영상 처리를 위한 header
#include <highgui.h> // 카메라로 영상을 입력받거나 이미지를 읽어들이고 화면에 보여주기 위한 header
다음은 IplImage 구조체로 image 라는 포인터를 생성하여 앞으로 이 것으로 이미지를 받고 처리하게 됩니다. IplImage 의 구조체는 이미지에 관련된 다양한 정보를 가지고 있으며 char 형 imageData 를 가지고서 이미지에 직접적인 접근을 할 수 도 있습니다.
IplImage* image = 0;
cvCaptureCAM() 함수를 이용 0 번째 연결된 카메라로부터 컨트롤을 얻어 옵니다. 숫자를 넣는 부분에 카메라의 인덱스 번호를 넣으면 현재 2 대 까지 연결이 가능하며 이렇게 연결된 capture 는 끝나기 전에 cvReleaseCapture() 함수로 release 해 주어야 합니다.
CvCapture* capture = cvCaptureFromCAM(0); // 0 번째 연결된 카메라로부터 컨트롤을 얻어 옵니다.
cvNamedWindow() 함수는 "T9-camera" 라는 타이틀의 윈도우를 생성합니다. 두번째 인자 값은 고정된 윈도우(0)를 생성 하거나 보여질 이미지의 크기에 맞게 자동 조절 윈도우(1)를 생성 할 수 있습니다. 두번째 인자를 0 으로 하고 아래 문장을 추가하면 윈도우 크기를 자유롭게 조절 할 수 있습니다. 이것은 입력 소스를 조절하는 것이 아니라 출력 창의 크기를 조절 하는 것이므로 화면의 크기를 키울 경우 사각 픽셀이 보이는 현상이 나타납니다.
cvNamedWindow( "T9-camera", 0 ); // T9-camera 라는 이름의 윈도우를 생성, 0 은 고정된 윈도우를 생성
cvResizeWindow( "T9-camera", 320, 240 ); // T9-camera 라는 이름의 윈도우 크기를 조절 width = 320, height = 240
그리고 카메라로 부터 매 프레임을 받아오기 위해서 while(1) 문으로 무한 loop 을 돌립니다. 이 무한 loop 는 if( cvWaitKey(10) >= 0 ) 문장을 통해 'ESC' 키가 눌려지면 종료하게 되고 종료되지 않는다면 다음과 같은 작업을 반복하게 됩니다. cvGrabFrame( capture ) 함수는 카메라로 부터 입력된 영상의 한 프레임을 잡고, cvRetrieveFrame( capture ) 함수는 잡은 프레임으로부터 이미지를 얻어 냅니다. 이 두 함수는 함께 쓰이며 카메라로부터 영상을 받아 이미지에 넣는 과정이라고 보시면 됩니다. 다음으로 cvShowImage( "T9-camera", image ) 함수는 image 를 "T9-camera" 라는 타이틀의 윈도우에 뿌려주게 되는데 해당 타이틀의 윈도우는 cvNamedWindow() 함수로 이전에 미리 만들어 두어야 합니다.
while(1) {
cvGrabFrame( capture ); // 카메라로부터 한 프레임을 잡습니다.
image = cvRetrieveFrame( capture ); // 잡은 프레임으로부터 IplImage 형 구조를 리턴 받아 image 에 넣습니다.
cvShowImage( "T9-camera", image ); // "T9-camera" 윈도우에 image 를 보여줍니다.
if( cvWaitKey(10) >= 0 )
break;
}
마지막으로 capture 를 release 하여 카메라와의 연결을 종료하고 윈도우를 소멸시키면 프로그램은 안정적으로 종료됩니다.
cvReleaseCapture( &capture );
cvDestroyWindow( "T9-camera" );
다음은 cvNamedWindow() 함수와 cvResizeWindow() 함수를 이용하여 윈도우 창의 크기를 변화 시켜 출력한 결과 화면입니다.
>> 소스코드 결과 화면
cvNamedWindow( "T9-camera", 0 ) 함수에서 두번째 인자가 '0' 이고
cvResizeWindow( "T9-camera", 320, 240 ) 함수를 추가 한 경우
>> cvNamedWindow( "T9-camera", 0 ) 함수에서 두번째 인자가 '0' 일 경우
>> cvNamedWindow( "T9-camera", 1 ) 함수에서 두번째 인자가 '1' 일 경우
- 주요 함수
A.윈도우 관련
cvNamedWindow( "T9-camera", 0 );
cvShowImage( "T9-camera", image );
cvDestroyWindow( "T9-camera" );
B.카메라 영상 캡쳐 관련
CvCapture* capture = cvCaptureFromCAM(0);
cvGrabFrame( capture );
image = cvRetrieveFrame( capture );
cvReleaseCapture( &capture );
문자 출력 (1) | 2011.10.30 |
---|---|
선, 사각형, 원, 타원 그리기 (0) | 2011.10.30 |
파일에서 영상읽기 및 화면에 출력하기 (0) | 2011.10.30 |
IplImage 구조체 (0) | 2011.10.29 |
Open CV 초보자가 하는 실수들 모음.. (0) | 2011.10.26 |
1. cvLoadImage(const char * filename, int iscolor = CV_LOAD_IMAGE_COLOR);
iscolor 는 영상의 컬러를 지정하는 인수다.
- CV_LOAD_IMAGE_COLOR이면 3채널 컬러 영상
- CV_LOAD_IMAGE_GRAYSCALE이면 1채널 그레이 스케일 영상
- CV_LOAD_IMAGE_UNCHANGED이면 원본 영상 그대로 읽어온다.
2. int cvSaveImage(const char * filename, const CvArr * image);
영상을 파일에 저장한다. 영상포맷은 파일의 확장자에 의해 정해지며, 8비트 단일채널과 3채널 컬러영상으로 저장할 수 있다.
3. int cvWaitKey(int delay = 0);
delay / 1000초 만큼 지연 대기한다. delay = 0 이면 키를 누를 때 까지 무한히 대기한다.
4. int cvNamedWindow(const char * name, int flags);
윈도우 캡션으로 사용하는 윈도우를 생성한다. name은 윈도를 식별하는 ID로 사용된다. 윈도우의 크기를 영상의 크기에 맞게 자동 조절하는 flags = CV_WINDOW_AUTOSIZE 만을 지원한다.
5. void cvDestroyWindow(const char * name);
생성된 윈도우를 파괴한다. 하나 이상일 때에는 cvDestroyAllWindows(void)함수를 이용한다.
6. void cvShowImage(const char * name, const CvArr * image);
name 이름을 갖는 윈도우에 영상 image를 보여준다.
영상불러와 화면에 출력(칼라)
if((srcImage=cvLoadImage("ear.jpg"))==NULL)
{
return;
}
printf("colorModel = %s \n", srcImage->colorModel);
printf("channelSeq = %s \n", srcImage->channelSeq);
printf("image pixel size = %d x %d \n", srcImage->width, srcImage->height);
printf("# of channel = %d \n", srcImage->nChannels);
printf("depth = %d \n", srcImage->depth);
cvNamedWindow("ear", CV_WINDOW_AUTOSIZE);
cvShowImage("ear", srcImage);
cvWaitKey(0);
cvDestroyWindow("ear");
cvReleaseImage(&srcImage);
(흑백)
cvLoadImage에서 두번째 인자를 CV_LOAD_IMAGE_GRAYSCALE 할 경우~!
선, 사각형, 원, 타원 그리기 (0) | 2011.10.30 |
---|---|
카메라 입력받기 (0) | 2011.10.30 |
IplImage 구조체 (0) | 2011.10.29 |
Open CV 초보자가 하는 실수들 모음.. (0) | 2011.10.26 |
카메라 입력받기 (0) | 2011.10.26 |
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 프로그래밍
카메라 입력받기 (0) | 2011.10.30 |
---|---|
파일에서 영상읽기 및 화면에 출력하기 (0) | 2011.10.30 |
Open CV 초보자가 하는 실수들 모음.. (0) | 2011.10.26 |
카메라 입력받기 (0) | 2011.10.26 |
Open CV 함수정리 (0) | 2011.10.25 |