'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

얼굴인식의 역사, 이슈, 알고리즘, Process flow, 기본적인 기술 비교  (1) 2011.11.06
이진화하기  (0) 2011.11.02
마우스 이벤트  (0) 2011.10.31
키보드 이벤트 처리  (0) 2011.10.30
문자 출력  (1) 2011.10.30
Posted by 아몰라

출처 http://www.bluenics.com/ , OpencvKorea


Automatic Face Recognition of Behavioral or Physiological Characteristicin Human Body

Ace Recognition Speed
Face Database Size
Development face recognition system
Experiment of Face Recognition

  The 1970's : general pattern classification method
research the features in face (profiles)
  The 1980's : continuous research pattern
  The 1990's : neural network classifier
capacity of real time caculation and adaptation
  The 2000's : concentration of research pattern
xcellent face recognition systems

  Public Method : Skin color method - general method,used combination method
Eigen face method - generalized eigen face, frontal -face focusing view
Neural Networks method - adaptation well in still image,train with face image but not
Features method - flexibility image scale,viewpoint of faces
Combination method - feature base + skin color


  Face recognition
  techniques :
Principal component analysis [S.Romdhani,1997]
Local feature Analysis [P.S.Pensv,1998]
Bayesian face recognition [A.Pentland,1996]
Gabor wavelets and elastic bunch graph matching algorithm [L.Wiskott,1997]
Linear Discriminant analysis [K.Etemad,1996]

  출입관리 보안응용분야 : 출입문 통제시스템
근태관리 시스템
실시간 감시 시스템
  Tcp/Ip 서버기반 응용분야 : 얼굴인식 화상 회의 및 채팅
인터넷 사용자 인증 image bank운영
  PC 기반 응용 분야 : 개인 사용자 로그온
파일 Encription
Screen Saver
  금융분야 응용분야 : CD /ATM Face Recognition Solution
POS Face Recognition Solution
Smart card 내에 얼굴영상등록후,ATM에서 카드인증
  Enterainment 응용분야 : 대화형 얼굴인식 완구
  가상현실 분야 : 3차원 얼굴인식 캐릭터
2차원 애니메이션 캐릭터
  온라인 교육 분야 : 사용자 인증,원격 교육


얼굴을 인식하는 기술은 매우 복잡하고 변수가 많은 기술로서 이의 소프트웨어적인 개발도 최근에 이르러서야 이루어졌습니다.

먼저 카메라가 얼굴의 이미지를 잡으면 소프트웨어가 이를 템플릿(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
Posted by 아몰라

이진화란?



요즘 카메라로 사진을 찍으면 칼라로 사진을 보통 사진을 찍게 되는데

사람이 보기에는 그냥 빨간색과 검정색옷을 입고 주변 색들도 눈으로 보이는 것과 같지만...

컴퓨터는 조명이나 그림자, 잡영 등에 영향을 받아서 색이 다 다르게 보인다.

그래서 컴퓨터에게 더 쉽게 이해하기 쉬운 영상으로 만들어주는 것이 이진화이다.

검정색과(0) 흰색(255)로 컬러 값을 바꾸는 것이다.



IplImage 타입의 영상을 이진화 하기 위해 사용하는 함수는 cvThreshold라는 함수이며,
이는 입력으로 들어가는 영상의 각 채널을 이진화 한다.
이런 이유로 컬러영상(3개 채널)을 이진화 하는 경우, R, G, B 각각을 이진화 하기 때문에
아래와 같이 의도하지 않은 영상을 얻게 될 수도 있다.



그런 이유 때문에 이진화 전에는 cvCvtColor()를 이용하여 Gray로 변환 후 이진화 한다.
cvCvtColor()의 세 번 째 인수는 어떤 컬러맵으로 변환할 것인지 선택할 수 있으며,
OpenCV에서 제공하는 방법들은 CV_BGR2GRAY 뿐만 아니라 
CV_BGR2YCrCb, CV_BGR2HSV, CV_BGR2Lab 등 여러가지이며 이는 cv.h 파일에서 확인할 수 있다.


cvThreshold() 함수는 실제로 이진화를 수행하는 함수로,
세 번 째 인수는 문턱치를 설정하고,
네 번 째 인수는 문턱치를 넘어선 픽셀들을 어떤 값으로 설정할 것인지를,
다섯 번 째 인수는 이진화 알고리즘을 선택할 수 있다.

중요함수

1.

cvThreshold(const CvArr*  src, CvArr*  dst, double  threshold, double  max_value, int threshold_type)

원본영상, 이진화가 된 후 저장될 영상, 경계가 되는 수치값(임계값), 임계 값을 넘는 픽셀값을 바꿔줄 최대값 설정,이진화방식)


이진화방식

#define CV_THRESH_BINARY      0  //  임계 값 이하 : 0, 임계 값 초과 : 1
#define CV_THRESH_BINARY_INV  1  // 임계 값 이하 : 1, 임계 값 초과 : 0 
#define CV_THRESH_TRUNC       2  // 임계 값 이하는 변화 없음, 임계 값 초과는 임계 값
#define CV_THRESH_TOZERO      3  //   임계 값 이하는 0, 임계 값 초과는 그대로
#define CV_THRESH_TOZERO_INV  4  // 임계 값 이하는 그대로, 임계 값 초과는 0



2.

cvCvtColor( const CvArr* src, CvArr* dst, int code )

원본영상, 변환후 저장될 영상, Color 변환모드


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 대한민국 최고의 컴퓨터비젼 커뮤니티)





 

Posted by 아몰라

cVSetMouseCallback 함수로 이벤트 핸들러 함수를 지정하고, 핸들러 함수에서 이벤트를 처리한다.


window_name = 이벤트를 발생시킬 윈도우의 이름을 적는다.
on_mouseEvent = 마우스 이벤트를 처리할 핸들러 함수를 적는다. 함수명은 사용자가 임의로 정해도된다. 단,  인수의 자료형과 의미는 미리 정해져있다.
param = 핸들러 함수로 전달될 사용자 정의 인수이다.



이렇게 인수가 정해져있다.

event = 마우스 이벤트
flags = 마우스 이벤트가 발생했을 때 마우스 버튼, CTRL, SHIFT, ALT 키를 눌렀는지 확인하기 위해 사용된다.
param = 사용자 정의 인수


마우스 이벤트(event)상수

CV_EVENT_MOUSEMOVE      마우스를 움직임
CV_EVENT_LBUTTONDOWN   왼쪽버튼 DOWN
CV_EVENT_RBUTTONDOWN   오른쪽 버튼 DOWN
CV_EVENT_LBUTTONUP        왼쪽 버튼 UP
CV_EVENT_RBUTTONUP        오른쪽 버튼 UP
CV_EVENT_LBUTTONDBLCLK 왼쪽 버튼 더블클릭
CV_EVENT_RBUTTONDBLCLK 오른쪽 버튼 더블클릭



마우스 flags 상수

CV_EVENT_FLAG_LBUTTON  왼쪽버튼누름
CV_EVENT_FLAG_RBUTTON 오른쪽버튼누름
CV_EVENT_FLAG_CTRLKEY CTRL 키를 누름
CV_EVENT_FLAG_SHIFTKEY SHIFT 키를 누름
CV_EVENT_FLAG_ALTKEY   ALT 키를 누름




예제 소스


#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 프로그래밍

 

Posted by 아몰라

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);

}


'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

이진화하기  (0) 2011.11.02
마우스 이벤트  (0) 2011.10.31
문자 출력  (1) 2011.10.30
선, 사각형, 원, 타원 그리기  (0) 2011.10.30
카메라 입력받기  (0) 2011.10.30
Posted by 아몰라

기본 문자를 출력하고 문자의 정확한 사이즈를 재보고 그것을 활용한다!


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
Posted by 아몰라


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
Posted by 아몰라

출처 - www.opencv.co.kr


카메라 영상을 입력받아 IplImage 형 구조체에 넣고 출력 윈도우의 크기를 조절해서 화면에 보여주는 작업


- 소스 코드(압축 파일 첨부)

 

#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 );

Posted by 아몰라

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
Posted by 아몰라

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 프로그래밍

Posted by 아몰라
이전버튼 1 2 이전버튼