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

출처 - www.opencv.co.kr


1번하고 6번은 비트를 했다면 알아야지 ㅋㅋㅋㅋ....나머지는 새로운 정보네...

좋다~!!!



1. cvCreateImage를 했으면 cdReleaseImage를 해야만 한다.

그래야 메모리 누수를 막을 수 있다.

 

다행인것은 openCV로 만든 프로그램이 죽을때 알아서 메모리를 릴리스 한다.(잘 만들었지요.)

위에서 언급한 것은 본인이 만든 소프트웨어가 돌아갈때 계속해서 create만 하고 relase를 안하면 메모리를 잡아먹기만 하는것이다.

image 하나 불러서 보여주는 루틴의 소프트웨어로도 메모리 2기가 잡아 먹을수 있다!!!

 

2. OpenCV의 컬러 이미지 순서는 B,G,R 이다. 즉 Blue, Green, Red 이다.

보통 우리는 R,G,B로 생각하게 되고

MATLAB의 이미지도 R,G,B 순서이다.

 

3. 이미지는 좌측하단이 (1.1) , 즉 오리진인 경우와

좌측 상단이 (1,1) 인 경우가 있다. MATLAB에서 처리하는 것과 openCV에서 처리하는 것과

보통 우리가 사용하는 Image(jpg, BMP)의 오리진 코디네잇이 다를 수 있다.

결과 이미지가 업사이트 다운 되었다고 말하기 전에 한번 살펴보아라.

 

업사이드 다운의 해결방안은 cvFlip(IplImage, NULL, 0); 를 이용하면 된다.

 

 

4. 이미지의 결과가 90도로 기울어 졌다면

보통 열과 행(너비와 높이)을 거꾸로 계산해서 나오는 경우다.

 

5.  OpenCV의 많은 함수가 single channel 함수이다. 즉 그레이 이미지만 다룰 수 있다.

따라서 컬러이미지의 경우 3개의 그레이 이미지로 나눈다음 원하는 함수를 적용후 다시 합치면

된다. 이것이 아니꼬우면 상용 인텔 이미지 프로세싱 라이브러리를 구입하면 된다. 아니면 직접 만들어서 openCV 커뮤니티에

도움을 주면 된다.

이런 문제를 방지하고자 하면 메뉴얼에서 그 함수가 single channel을 지원하는지 아니면 multi channel을 적용하는지

한번쯤 주의깊에 살펴보면 된다.

보통 나오는 에러메시지가 depth 어쩌구 저쩌구이다.  depth는 채널의 깊이이다.

1이면 그레이 이미지 3이면 컬러이미지 4이면 컬러+알파채널이다.

 

 

6. 어떤 환경에서 프로그래밍을 하면 젤 먼저 해보는 예제가 hello world. 왜 이것을 하는지는 모르겠지만, 아마 어떤 이야기가 있겠지요. 그럼 그 다음에 해야하는데 디버깅툴을 알아보는 것. 내가 결국은 복잡한 프로그래밍을 할 것인데 그때는 디버깅을 어떻게 해야할 것인가? 이것을 반듯이 테스트 해봐야 한다. MS Visual Studio를 사용한다면 디버깅은 훌륭하게 지원하니까 별 문제가 안되는데

리눅스를 사용한다면 약간 머리를 써야 한다. 리바운드를 제압한 자가 시합을 제압한다라는 말, 디버깅을 잘하는 자가 좋은 프로그램을 만든다. 이 부분 반듯이 숙지하시길...

 

openCV경우는 조그만 창을 열어서 중간과정의 결과물을 보는것도 일종의 디버깅이고

메모리 누수를 막는것도 디버깅이고

복잡한 계산 결과를 저장한 변수가 제대로 저장하고 있나는 찾는 것도 디버깅이다.

디버깅에 대한 노하우를 반듯이 찾아서 습득하고 있을것.

디버깅 축에도 안드는 것이 컴파일  및 링킹 에러인데 자신이 만들어서 처음으로 컴파일 했는데

에러 메시지가 많고 영어라서 두렵고 짜증나는 것은 디버깅 축에도 못낀다. 사실 그 영어를 조금만 읽어보고

그 에러메시지를 구글에 때려 넣어서 찾으면 답은 금방 나온다. 디버깅은 컴파일도 잘되고 링킹도 잘되는 프로그램이

원하지 않는 값을 내 놓을때부터 본격적인 시작이다. 내가 변수를 잘 못썼을수도 있고, 논리적으로 잘 못 전개했을수도 있고

프로그램의 설계 자체가 잘못 되었을수도 있고 등등...


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

파일에서 영상읽기 및 화면에 출력하기  (0) 2011.10.30
IplImage 구조체  (0) 2011.10.29
카메라 입력받기  (0) 2011.10.26
Open CV 함수정리  (0) 2011.10.25
Open CV 설치 및 셋팅 (Visual 2010)  (0) 2011.10.25
Posted by 아몰라

출처 - www.opencv.co.kr

정말 설명 잘 되있네 그려~~~~~~




이번 강좌에서는 OpenCV 를 이용하여 간단하게 카메라 영상을 입력받아 IplImage 형 구조체에 넣고 출력 윈도우의 크기를 조절해서 화면에 보여주는 작업을 할 것입니다. 1편을 통하여 기본적인 셋팅 방법은 습득 하셨을테니 바로 아래와 같은 소스코드를 작성한 후 컴파일 해 봅시다.

  

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

 

#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() 함수를 이용하여 윈도우 창의 크기를 변화 시켜 출력한 결과 화면입니다.

 

 

 

- 주요 함수

A.윈도우 관련

  cvNamedWindow( "T9-camera", 0 );
  cvShowImage( "T9-camera", image );
  cvDestroyWindow( "T9-camera" );

 

B.카메라 영상 캡쳐 관련

  CvCapture* capture = cvCaptureFromCAM(0);
  cvGrabFrame( capture );
  image = cvRetrieveFrame( capture );

  cvReleaseCapture( &capture );

 

 

Copyrights (c) 2005 OpenCV.co.kr. All rights reserved.

Media System Lab., Yonsei University
by Dong-Chul Kim, e-mail: opencv at opencv.co.kr

- T9T9.com


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

IplImage 구조체  (0) 2011.10.29
Open CV 초보자가 하는 실수들 모음..  (0) 2011.10.26
Open CV 함수정리  (0) 2011.10.25
Open CV 설치 및 셋팅 (Visual 2010)  (0) 2011.10.25
Open CV 란?  (0) 2011.10.25
Posted by 아몰라

아고~~빨리 다시 c랑 c++좀 봐야겠다~~너무 안봤더니 기억이 잘 안나네;;;

이건 오픈시브이 카페에서 퍼왔다!!! 참고해야지~



IplImage 구조체 멤버명

 

nChannels : 영상의 픽셀 당 채널 수를 나타내며 1~4 값이며 흑배영상의 채널의 수는 1이고 RGB 컬러영상의 채널의 수는 3이고 RGB 컬러순서는 다음과 같다.

 

b0

g0

r0

b1

g1

r1

b2

g2

r2

b3

g3

r3

 

origin : 영상의 원점을 나타낸다. 0top-left origin, 1bottom-left origin을 의미한다. 다음은 Opencv에서 origin이 나타내는 상수이다.

 

origin

설명

IPL_ORIGIN_TL (0)

TLTop Left의 약자이며 왼쪽 상단을 나타낸다.

IPL_ORIGIN_BL (1)

BLBottom Left의 약자이며 왼쪽 하단을 나타낸다.

 

depth : 영상데이터를 저장하기위해 사용되는 비트의 수를 나타낸다. depth는 컴퓨터 언어에서 자료형(data type)과 같이 예를 들어, C언어에서 정수형에 int형과 long형이 있고 실수형에 floatdouble이 있듯이 데이터를 몇 비트를 가지고 표현할 것인가를 나타낸다.

다음은 OpenCV에서 depth를 나타나는 상수이다.

 

depth

설명

IPL_DEPTH_8U

8비트 unsigned integer (0~255)

IPL_DEPTH_8S

8비트 signed integer (-128~127)

IPL_DEPTH_16U

16비트 unsigned integer

IPL_DEPTH_16S

16비트 signed integer

IPL_DEPTH_32S

32비트 signed integer

IPL_DEPTH_32F

32비트 floating-point number

IPL_DEPTH_64F

64비트 floating-point number

 

만약 흑백영상에서 depthIPL_DEPTH_8U이면 색상 데이터를 0~255사이의 정수로 나타내고 IPL_DEPTH_32F이면 32비트 실수로 표현하겠다는 뜻이다. 마찬가지로 RGB 컬러영상에서 depthIPL_DEPTH_8U이면 각 채널 당 색상 데이터를 0~255사이의 정수로 나타내고 IPL_DEPTH_32F이면 각 채널 당 32비트 실수로 표현하겠다는 뜻이다.

 

width : 영상의 가로크기를 나타내며 단위는 픽셀이다.

 

height : 영상의 세로크기를 나타내며 단위는 픽셀이다.

 

widthStep : 영상에서 가로 크기를 나타내며 단위는 바이트이다. widthStep = width * nChannels이다. 8비트 1채널 영상에서 영상의 가로크기가 100픽셀이면 widthStep = 100 * 1100 바이트이고 8비트 3채널 영상에서 영상의 가로크기가 100픽셀이면 widthStep = 100 * 3300바이트가 된다.

 

imageSize : 영상의 크기를 나타내며 단위는 바이트이다. imageSize = width * height * nChannels이다. 가로 256픽셀, 세로 256픽셀인 흑백영상에서 imageSize65,536 바이트 (256픽셀 * 256픽셀 * 1채널 = 65,536바이트)이고 가로 256픽셀, 세로 256픽셀인 컬러영상에서 imageSize196,608바이트 (256픽셀 * 256픽셀 *3채널 = 196,608바이트)가 된다.

 

imageData : 256 * 256 흑백영상에서 첫 픽셀의 데이터는 imageData[0], 두 번째 픽셀의 데이터는 imageData[1], 마지막 픽셀의 데이터는 imageData[65535]에 들어 있다. 다음은 흑백영상에서 6개 픽셀에 저장된 픽셀값들을 보여주고 있다.

 

imageData[0]

imageData[1]

imageData[2]

imageData[3]

imageData[4]

imageData[5]

100

120

150

130

140

160

 

컬러영상에서 픽셀에 저장되는 채널의 순서는 BGR 순서에 따라 영상 데이터가 저장된다. 다음은 컬러영상에서 2개의 픽셀에 저장된 픽셀값들을 보여주고 있다.

 

imageData[0]

imageData[1]

imageData[2]

imageData[3]

imageData[4

imageData[5]

100

120

150

130

140

160

 

여기서는 (B, G, R)(100, 120, 150) 혹은 (130, 140, 160)에 의해 각각 다른 두 가지 컬러 색을 나타낸다.

 

영상 읽기

 

cvLoadImage 함수

 

영상을 메모리 상에 로드하는데 사용되는 함수이다.

 

IplImage* cvLoadImage( char * filename, int iscolor );

 

filename

로드되는 파일의 이름을 가리킨다.

 

iscolor

로드되는 영상의 색상을 가리킨다.

iscolor > 0이면 3채널 컬러 영상으로 변환하여 로드한다.

iscolor = 0이면 흑백 영상으로 변환하여 로드한다.

iscolor < 0이면 원래의 영상 그대로 로드한다. , 원래 영상이 3채널 컬러영상은 컬러영상으로 흑백영상은 그대로 흑백영상으로 로드한다. 예를 들어, 다음은 Lena 컬러영상을 컬러영상 그대로 메모리 상에 로드한다.

 

IplImage* image;

image = cvLoadImage("../images/Lena.jpg", -1);

 

만약에 컬러영상을 흑백영상으로 변환하여 로드하고자 하는 경우는 다음과 같다.

 

IplImage* image;

image = cvLoadImage("../images/Lena.jpg", 0);

 

Opencv에서 지원되는 파일의 종류

 

파일

설명

BMP, DIB

Windows 비트맵

JPEG, JPG, JPE

JPEG 파일

PNG

Portable Network Graphics

PBM, PGM, PPM

Portable 영상 포맷

SR, RAS

Sun rasters

TIFF, TIF

TIFF 파일

영상 출력

 

cvNamedWindow 함수

 

영상을 출력하기 위한 윈도우를 만들기 위해 사용되는 함수이다.

 

int cvNamedWindow(char* name, int flags;

 

name

윈도우의 이름을 나타낸다.

 

flags

윈도우의 크기조절을 나타내기 위한 플래그이다. 플래그가 CV_WINDOW_AUTOSIZE이면 윈도우의 크기는 자동으로 출력할 영상의 크기에 맞춘다. CV_WINDOPW_AUTOSIZE 대신 1을 사용할 수 있다. 이 경우 출력된 윈도우의 크기를 사용자가 마우스를 가지고 크기 조절을 할 수 없다. 플래그가 0인 경우 사용자가 마우스로 크기 조절을 할 수 있다.

 

cvShowImage 함수

 

cvNamedWindow() 함수에 의해 지정된 윈도우에 영상을 출력하기 위해 사용하는 함수이다.

 

void cvShowImage(char* name, CvArr* image);

 

name

윈도우의 이름이며 cvNamedWindow() 함수에 의해 지정된 이름과 동일하다.

 

Image

출력할 영상을 나타내며 cvLoadImage() 함수에 의해 로드된 영상을 지정한다.

 

cvWaitKey 함수

 

키보드로부터 키 입력을 기다리기 위한 함수이다.

 

int cvWaitKey(int delay);

 

delay

지정된 시간(단위 : milliseconds) 동안 기다린다.

cvWaitKey() 함수는 영상을 화면에 출력할 때 출력되는 시간을 지정하기 위해 사용한다. delay 0인 경우 예를 들어, cvWaitKey(0)이면 영상이 출력된 상태에서 무한히 키보드 입력을 기다리다 키를 입력하면 입력된 키의 코드를 반환한다. cvWaitKey(1000)임녀 1초 동안 기다리고 cvWaitKey(10000)이면 10초동안 기다린다. 만약 지정된 시간동안 키보드로부터 사용자가 키를 입력하지 않으면 -1을 반환한다.

 

cvReleaseImage 함수

 

cvLoadImage() 함수를 이용하여 메모리에 로드된 영상이 메모리로부터 해제하기 위해 사용하는 함수이다.

 

void cvReleaseImage( IplImage** image);

 

image

imageIplImage 구조체의 이중 포인터이다. 따라서 포인터 변수 image가 수록되어 있는 주소를 가리키므로 &image로서 나타낸다. 다음은 Lena 영상을 메모리에 로드하고 로드된 영상을 메모리에서 해제하는 예이다.

 

IplImage* image;

image = cvLoadImage("../images/Lena.jpg", -1);

cvReleaseImage(&image);

 

cvCreateImage 함수

 

영상을 만들기 위해 사용하는 함수이다.

 

IplImage* cvCreateImage( cvSize size, int depth, int channels);

 

size

영상의 크기를 지정한다. 영상의 크기는 cvSize() 함수와 cvGetSize() 함수를 사용하여 지정한다. 영상의 가로와 세로 길이를 직접 지정하고자 하는 경우는 cvSize() 함수를 사용하여 cvSize(width, height)처럼 지정하고 특정한 영상의 크기와 똑같은 크기의 영상을 만들고자 하는 경우는 cvGetSize() 함수를 사용하여 cvGetSize(src_image)처럼 지정한다.

 

depth

영상 데이터의 깊이(단위:비트)를 지정한다. 1채널 영상인 경우는 픽셀의 깊이가 되고 3채널 영상인 경우 각 채널의 깊이가 된다.

 

depth

설명

IPL_DEPTH_8U

8비트 unsigned integer (0~255)

IPL_DEPTH_8S

8비트 signed integer (-128~127)

IPL_DEPTH_16U

16비트 unsigned integer

IPL_DEPTH_16S

16비트 signed integer

IPL_DEPTH_32S

32비트 signed integer

IPL_DEPTH_32F

32비트 floating-point number

IPL_DEPTH_64F

64비트 floating-point number

 

channels

픽셀 당 채널 수를 지정한다.

예를 들어, 영상의 크기 640 * 480인 흑백영상을 만들고자 하는 경우 흑백영상은 1채널이므로 다음과 같다.

 

IplImage* image = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);

 

여기서 채널의 깊이는 8비트로 지정하고 있다. , 0255사이 256개의 정수값으로 표현하겠다는 의미이다. 만약에 영상의 크기 640 * 480인 컬러영상을 만들고자 하는 경우 RGB 컬러영상은 3채널이므로 다음과 같다.

 

IplImage* image = cvCreateImage(cvSize(640,480), IPL_DEPTH_32F, 3);

 

여기서는 각 채널의 깊이는 32비트로 지정하고 있다. 비록 컬러영상이지만 각 채널의 깊이를 흑백영상처럼 8비트로 다음과 같이 지정할 수도 있다.

 

IplImage* image = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U,3);

 

cvSplit 함수

 

다채널 영상을 단일 채널 영상으로 분리하고자 하는 경우 사용하는 함수이다.

 

void cvSplit( CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3);

 

src

다채널 영상을 나타낸다.

 

dst0, dst1, dst2, dst3

단일 채널 영상을 나타낸다.

영상 저장

 

cvSaveImage 함수

 

영상을 파일에 저장하기 위한 함수이다.

 

int cvSaveImage( char* filename, CvArr* image);

 

filename

저장할 파일이름을 나타낸다.

 

image

저장할 영상을 가리킨다.

다음은 cvSaveImage() 함수의 사용 예를 보여준다.

 

IplImage* image;

cvSaveImage("../images/Lena.jpg", image);

 

산술연산

 

단일 영상에서 산술연산

 

cvAddS 함수

 

영상에 상수값을 더하기 위해 사용하는 함수이다.

 

void cvAddS( CvArr* src, CvScalar value, CvArr* dst, CvArr* mask(NULL) );

 

src

원 영상을 나타낸다.

 

value

더하고자 하는 상수값을 지정한다. 상수값은 CvScalar 자료형을 갖는 CV_RGBcvScalarAll() 함수를 사용하여 지정한다. CV_RGB를 사용하여 지정하는 경우 예를 들어, 흑백영상에서 임의의 픽셀에 100을 더하고자 하는 경우 상수값은 CV_RGB(100, 100, 100)처럼 지정하고 컬러영상에서 RGB 각 채널에 상수값 100, 110, 120을 더하고자 하는 경우 상수값은 CV_RGB(100, 100, 120)처럼 지정하면 된다.

 

dst

목적 영상을 나타낸다.

 

mask

마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.

예를 들어, 원 영상 src60을 더하여 목적영상 dst를 얻고자 하는 rsuddn 다음과 같다

 

cvAddS(src, CV_RGB(60, 60, 60), dst, NULL);

 

cvSubS 함수

 

영상에 상수값을 빼기 위해 사용하는 함수이다.

 

void cvSubS( CvArr* src, CvScalar value, CvArr* dst, CvArr* mask(NULL) );

 

src

원 영상을 나타낸다.

 

value

빼고자 하는 상수값을 지정한다.

 

dst

목적 영상을 나타낸다.

 

mask

마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.

예를 들어, 원 영상 src60을 빼서 목적영상 dst를 얻고자 하는 경우 다음과 같다.

 

cvSubS(src, CV_RGB(60, 60, 60), dst, NULL);

 

cvMul 함수

 

두 영상 간의 곱셈을 수행하는 함수이다.

 

void cvMul( CvArr* src1, CvArr* src2, CvArr* dst, double scale=1 );

 

src1

첫 번째 영상을 나타낸다.

 

src2

두 번째 영상을 나타낸다.

 

 

dst

목적영상을 나타낸다.

 

scale

곱하고자 하는 상수를 나타낸다.

 

cvMul() 함수는 dst = scale * src1 * src2를 수행한다. 따라서 cvMul() 함수를 이용하여 우리가 원하는 한 영상에서 상수값 곱셈을 수행하기 위해서는 두 번째 영상 src2를 픽셀값이 전부 1인 단위 영상으로 만들어 사용한다. Opencv에서 제공하는 cvSet() 함수를 사용하여 임의의 영상을 단위영상으로 만들 수 있다.

 

cvSet 함수

 

행렬 혹은 영상을 주어진 원소 혹은 픽셀값으로 채우기 위해 사용하는 함수이다.

 

void cvSet( CvArr* arr, CvScalar value, CvArr* mask=NULL );

 

arr

목적영상을 나타낸다.

 

value

채우고자 하는 상수이며 상수값은 cvScalar 자료형을 갖는 CV_RGBcvScalarAll() 함수를 사용하여 지정한다. cvScalarAll() 함수를 사용하여 예를 들어, 0 혹은 255로 채우고자 하는 경우 cvScalarAll(0) 혹은 cvScalarAll(255)처럼 사용하면 된다.

 

mask

마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.

 

두 영상간의 산술연산

 

cvAdd 함수

 

두 영상 간의 덧셈을 수행하는 함수이다.

 

void cvAdd( CvArr* src1, CvArr* src2, CvArr* dst, CvArr* mask=NULL);

 

src1

첫 번째 영상을 나타낸다.

 

src2

두 번째 영상을 나타낸다.

 

dst

목적영상을 나타낸다.

 

mask

마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.

cvAdd() 함수는 dst = src1 + src2를 수행한다.

 

cvSub 함수

 

두 영상 간의 뺄셈을 수행하는 함수이다.

 

void cvSub( CvArr* src1, CvArr* src2, CvArr* dst, CvArr* mask=NULL );

 

src1

첫 번째 영상을 나타낸다.

 

src2

두 번째 영상을 나타낸다.

 

dst

목적영상을 나타낸다.

 

mask

마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정하낟.

cvSub() 함수는 dst = src1 - src2를 수행한다.

 

cvDiv 함수

 

두 영상 간의 나눗셈을 수행하는 함수이다.

 

void cvDiv( CvArr* src1, CvArr* src2, CvArr* dst, double scale=1 );

 

src1

첫 번째 영상을 나타낸다.

 

src2

두 번째 영상을 나타낸다.

 

dst

목적영상을 나타낸다.

 

scale

곱하고자 하는 상수를 나타낸다.

cvDiv() 함수는 dst = scale * (src1/src2)를 수행한다.

 

영상 반전

 

cvNot 함수

 

반전 영상을 얻기 위해 사용하는 함수이다.

 

void cvNot( CvArr* src, CvArr* dst );

 

src

원영상을 나타낸다.

 

dst

목적영상을 나타낸다.

cvNot() 함수는 dst = ~ src를 수행한다.

 

이진영상

 

cvThreshold 함수

 

영상에서 이진화하기 위한 함수이다.

 

cvThreshold( CvArr* src, CvArr* dst, double threshold, double maxValue, CvThreshType type );

 

src

원영상을 나타낸다.

 

dst

결과영상을 나타낸다.

 

threshold

임계값을 나타낸다.

 

maxValue

픽셀의 최대 명암값을 나타낸다.

 

type

이진화 방식을 결정한다.

 

이진화 방식

설명

CV_THRESH_BINARY

임계값 초과 : 255, 임계값 이하 : 0

CV_THRESH_BINARY_INV

임계값 초과 : 0, 임계값 이하 : 255

CV_THRESH_TRUNC

임계값 초과 : 임계값, 임계값 이하 : 원래 픽셀값

CV_THRESH_TOZERO

임계값 초과 : 원래 픽셀값, 임계값 이하 : 0

CV_THRESH_TOZERO_INV

임계값 초과 : 0, 임계값 이하 : 원래 픽셀 값

영상 변환

 

cvCvtColor 함수

 

컬러영상을 다른 영상으로 변환하는데 사용하는 함수이다.

 

void cvCvtColor( CvArr* src, CvArr* dst, int code );

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

code

컬러 변환 모드이고 다음의 형식에 의해 변환하고자 하는 모드를 지정하면 된다.

 

CV_<src_color_space>2<dst_color_space>

 

여기서 <src_color_space><dst_color_space>은 다음 중 하나이다.

 

RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

 

예를 들어, RGB 컬러영상을 흑백영상으로 변환하기 위해서는 다음과 같다.

 

cvCvtColor(src_image, dst_image, CV_RGB2GRAY);

 

또는 RGB 컬러영상을 HSV 컬러 영상으로 변환하기 위해서는 다음과 같다.

 

cvCvtColor(src_iamge, dst_image, CV_RGB2HSV);

 

영상의 블러링

 

cvSmooth 함수

 

영상을 스무딩하는데 사용하는 함수이다.

 

void cvSmooth( CvArr* src, CvArr* dst, int smoothtype, int param1, int param2, double param3);

 

src

원 영상을 나타낸다.

 

dst

목적영상을 나타낸다.

 

smoothtype

스무딩 형태를 지정한다.

 

스무딩 형태

설명

CV_BLUR

단순한 블러링을 나타낸다.

param1 * param2 근방영역에 대해 합을 구한 다음 param1 * param2로 나눈다.

CV_GAUSSIAN

가우시안 블러링을 나타낸다.

param1 * param2 근방영역에 대해 가우시안 마스크를 사용한다. param3은 표준편차이다.

CV_MEDIAN

중앙값 블러링을 나타낸다.

param1 * param2 근방영역에 대해 중앙값을 취한다.

 

param1

마스크의 가로를 나타낸다.

 

param2

마스크의 세로를 나타낸다.

 

param3

가우시안 마스크인 경우 표준편차(sigma)를 지정하는데 만약에 param3=0을 지정하면 param3값은 다음과 같다.

 

sigam = (n/2 -1) * 0.3 + 0.8

 

여기서 nn * n 마스크에서 n의 값이다.

 

cvFilter2D 함수

 

사용자가 정의한 마스크를 가지고 영상을 컨벌류션하기 위해 사용하는 함수이다.

 

void cvFilter2D( CvArr* src, CvArr* dst, CvMat* kernel );

 

src

원 영상을 나타낸다.

 

dst

목적영상을 나타낸다.

 

kernel

컨벌류션 할 마스크를 나타내고 cvMat() 함수 및 cvCreateMat() 함수를 사용하여 지정한다. 단 마스크의 원소들은 1채널 실수형이어야 한다.

 

cvMat 함수

 

이미 만들어진 행렬을 지정하는 함수이다.

 

CvMat cvMat( int rows, int cols, int type, void* data=NULL );

 

rows

행렬에서 행의 수를 나타낸다.

 

cols

행렬에서 열의 수를 나타낸다.

 

type

행렬 원소의 형태를 지정하며 당므과 같은 형식에 의해 지정한다.

 

CV_<bit_depth>(S|U|F>C<number_of_channels>

 

예를 들어, CV_8UC18-bit unsigned 1채널 행렬이고 CV_32SC232-bit signed 2채널 행렬이다.

 

data

행렬에 대한 포인터를 나타낸다.

 

영상의 샤프닝

 

OpenCV에서는 영상의 샤프링을 지원하는 함수는 없다. 우리는 OpenCVcvMat() 함수를 사용하여 샤프링 마스크를 정의하고 cvFilter2D() 함수를 사용하여 정의된 마스크를 사용하여 컨벌류션을 수행

에지 검출

 

cvSobel 함수

 

Sobel 연산자를 이용하여 에지검출을 위한 함수이다.

 

void cvSobel( CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );

 

src

원 영상을 나타낸다.

 

dst

목적영상을 나타낸다.

 

xorder

x 방향 미분을 나타낸다.

 

yorder

y 방향 미분을 나타낸다.

 

aperture_size

커널의 크기를 나타낸다.

 

예를 들어, cvSobel(src, dst, 1, 0, 3)이면 x 방향으로 미분만을 고려한 Soble 방법을 의미하고 cvSobel(src, dst, 0, 1, 3)이면 y방향으로 미분만을 고려한 Sobel 방법을 의미한다. 그리고 cvSobel(src, dst, 1, 1, 3)이면 x 방향으로 미분과 y 방향으로 미분을 고려한 Sobel 방법을 의미한다.

cvSobel() 함수를 사용하는데 주의할 사항은 src8비트 영상이면 dst16비트 영상이어야 한다. 따라서 에지 영상을 출력하기 위해서는 다시 8비트 영상으로 변환해야한다. 이를 위해 cvCVonvertScale() 함수를 사용하여 영상을 변환한다.

 

cvConvertScale 함수

 

영상을 변환하는데 사용하는 함수이다.

 

void cvConvertScale( CvArr* src, CvArr* dst, double scale=1, double shift=0 );

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

scale

스케일 파라미터를 나타낸다.

 

shift

이동 파라미터를 나타낸다.

 

cvConvertScale() 함수는 src 영상을 dst 영상으로 변환하는덴 주어진 스케일 파라미터와 이동 파라미터를 가지고 다음과 같이 변환한다.

 

dst = src * scale + shift

 

cvLaplace 함수

 

라플라시안 연산자를 이용하여 에지검출을 위한 함수이다.

 

void cvLaplace( CvArr* src, CvArr* dst, int aperture_size=3 );

 

src

원 영상을 나타낸다.

 

dst

목적영상을 나타낸다.

 

aperture_size

커널의 크기를 나타낸다.

OpenCV를 이용한 히스토그램

 

cvCreateHist 함수

 

히스토그램을 정의하는데 사용하는 함수이다.

 

CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 );

 

dims

히스토그램 차원을 지정한다. 흑백영상이면 1차원이고 컬러영상이면 3차원이다.

 

sizes

히스토그램 차원의 크기를 나타내며 배열로 표시한다. 예를 들어, 1차원 256 흑백영상인 경우 0부터 255까지 256개 막대를 사용하므로 다음과 같이 정의한다.

 

int sizes[1] = {256};

 

그리고 3차원 컬러영상인 경우 각각의 채널은 256개 막대를 사용함으로 다음과 같이 정의한다.

 

int sizes[3] = {256, 256, 256};

 

type

히스토그램 표현 형식(histogram representation format)을 나타낸다. type = CV_HIST_ARRAY이면 다채널 밀집 배열(multi-dimensional dense array)을 나타내고 type = CV_HIST_SPARSE이면 다채널 희소 배열(multi-dimensional sparse array)을 나타낸다. 여기서 밀집배열이냐 희소배열이냐는 0인 원소가 많이 포함되면 희소배열이고 그렇지 않으면 밀집배열을 나타낸다.

 

ranges

히스토그램의 x축 범위를 나타낸다.

 

uniform

히스토그램에서 막대 간격을 같게 할 것인지 다르게 할 것인지 결정한다.

uniform 0이면 막대의 간격을 일정 간격으로 한다.

cvCreateHist() 함수는 CvHistogram 구조체를 반환하는데 CvHistogram 구조체의 형식은 다음과 같다.

 

typedef struct CvHistogram

{

int type;

CvArr* bins;

float thresh[CV_MAX_DIM[3]; /* for uniform histograms */

float ** thresh2; /* for non-uniform histograms */

CvMatND mat; /* embedded matrix header for array histograms */

}CvHistogram;

 

cvCalcHist 함수

 

영상으로부터 히스토그램을 계산하는데 사용하는 함수이다. , 영상에서 cvCreateHist() 함수에 의해 이미 정의된 히스토그램을 계산한다.

 

void cvCalcHist( IplImage** img, CvHistogram* hist);

 

img

원 영상을 나타낸다.

 

hist

히스토그램에 대한 포인터를 나타낸다.

 

cvGetMinMaxHistValue 함수

 

히스토그램데서 막대에 대한 최대 빈도수와 최소 빈도수를 구하는 함수이다.

, 명암값 들에 대한 최대 빈도수와 최소 빈도수를 구한다.

 

void cvGetMinMaxHistValue( CvHistogram* hist, flaot* value_min, float* value_max);

 

hist

히스토그램을 나타낸다.

 

value_min

히스토그램의 최소 빈도수를 나타낸다.

 

value_max

히스토그램의 최대 빈도수를 나타낸다.

 

cvScale 함수

 

하나의 배열을 다른 배열로 선형 변환에 의해 변환하는 함수이다.

 

void cvScale( CvArr* src, CvArr* dst, double scale=1, double shift=0);

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

scale

스케일 파라미터를 나타낸다.

 

shift

이동 파라미터를 나타낸다.

cvScale() 함수는 dst = src * scale + shift에 의해 변환된다. 참고로 cvScale() 함수는 cvConvertScale() 함수와 동일한 함수이다.

 

cvRectangle 함수

 

직사각형을 그리기위한 함수이다.

 

void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1 );

 

img

직사각형이 그려질 영상을 나타낸다

 

pt1

직사각형의 모서리를 나타낸다.

 

pt2

직사각형의 반대편 모서리를 나타낸다.

 

color

직사각형의 선의 색상을 나타낸다.

 

thickness

직사각형의 선의 두께를 나타낸다.

 

cvRectangle() 함수에서 모서리 좌표 pt1pt2를 정할 때 원점 (0, 0)이 어디에 위치하느냐가 중요하다. 수학좌표에서 원점과 영상에서 원점은 다르기 때문이다.

수학 좌표에서 원점은 왼쪽 하단이나 영상 좌표에서 원점은 왼쪽 상단이다.

 

cvGetReal1D 함수

 

1차원 히스토그램에서 i 번째 막대의 빈도수를 얻기 위한 함수이다.

 

double cvGetReal1D( CvArr* arr, int idx0 );

 

arr

1차원 배열을 의미한다.

 

idx0

원소의 위치에 대한 인덱스를 나타낸다.

예를 들어, cvGetReal1D(histo->bins, i)는 배열 bins에서 i번째 인덱스에 대한 원소를 반환한다.

 

cvSet 함수

 

영상을 주어진 값으로 설정할 때 사용하는 함수이다.

 

void cvSet( CvArr* arr, CvScalar value, CvArr* mask=0 );

 

arr

원 영상을 나타낸다.

 

value

채울 값을 지정한다.

 

mask

마스크를 나타낸다.

예를 들어, cvSet( histImage, cvScalarAll(255), 0 )이면 영상 histImage의 픽셀값을 255로 설정한다.

히스토그램 평활화

 

cvEqualizeHist 함수

 

흑백영상에서 히스토그램 평활화하는데 사용하는 함수이다.

 

void cvEqualizeHist( CvArr* src, CvArr* dst );

 

src

흑백 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

영상 확대 및 축소

 

cvResize 함수

 

영상의 크기를 조절하는 함수이다.

 

void cvResize( CvArr* src, CvArr * dst, int interpolation=CV_INTER_LINEAR );

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

interpolation

보간법을 나타내며 다음의 방법이 있다.

(a) CV_INTER_NN - 최근접 이웃 보간법(nearst-neighbor interpolation)

(b) CV_INTER_LINEAR - 양선형 보간법(bilinear interploation (used by default))

(c) CV_INTER_AREA - 재표본 추출법(resampling using pixel area relation)

(d) CV_INTER_CUBIC - 큐빅 보간법(bicubic interpolation)

 

회전 영상

 

cv2DRotationMatrix 함수

 

2 * 3 변환행렬을 생성하기 위한 함수이다.

 

CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale, CvMat* map_matrix );

 

center

회전 중심을 나타낸다.

 

angle

회전 각도를 나타낸다. 각도는 화면좌표계에서 원점을 중심으로 반시계 방향의 각을 의미한다.

 

scale

스케일 척도를 나타낸다. 예를 들어, scale=2이면 2배 만큼 영상이 확대된다.

 

map_matrix

생성되는 2 * 3 변환행렬을 가리키는 포인터를 나타낸다.

 

 

여기서 α=scale*cos(angle), β=scale*sin(angle)이다.

 

cvWarpAffine 함수

 

cv2DRotationMatrix() 함수에서 생성된 변환 행렬을 영상에 적용하는 함수이다.

 

void cvWarpAffine( CvArr* src, CvArr* dst, CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) );

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

map_matrix

2 * 3 변환행렬을 나타낸다.

 

flags

다음 중 하나의 선택사항을 지정한다.

(a) CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS

양선형 보간법을 사용하고 목적 영상의 모든 픽셀을 어떤 값으로 채운다.

(b) CV_WARP_INVERSE_MAP

목적 영상에서 원 영상으로 역 변환에 의해 보간한다. , 역방향 사상에 의해 보간한다.

 

fillval

목적 영상에서 회전 후 남는 공간을 채울 색을 지정한다. 디폴트는 픽셀값이 0인 검은색이다.

대칭 영상

 

cvFlip 함수

 

void cvFlip( CvArr* src, CvArr* dst, int flip_mode=0);

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

flip_mode

(a) flip_mode = 0이면 상하 대칭(디폴트)이다.

(b) flip_mode > 0이면 좌우 대칭이다.

(c) flip_mode < 0이면 상하 대칭 후 좌우 대칭이다.

 

침식 연산과 팽창 연산

 

cvDilate 함수

 

팽창연산을 수행하기 위한 함수이다.

 

void cvDilate( CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

element

구조적 요소를 나타내며 만약 element = NULL이면 3 * 3 사각형 구조적 요소가 사용된다. IplConvKernel은 구조적 요소를 표현하는 구조체이다.

 

iterations

팽창 연산 수행 횟수를 나타낸다.

 

cvCreateStructuringElementEx 함수

 

구조적 요소를 정의하기 위한 함수이다.

 

IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape );

 

cols

구조적 요소의 열의 수를 나타낸다.

 

rows

구조적 요소의 행의 수를 나타낸다.

 

anchor_x

중심점의 x 좌표를 나타낸다(0 .. cols-1). 만약 3 * 3 사각형 구조적 요소이면 anchor_x=1이 되고

5 * 5 사각형 구조적 요소이면 anchor_x=2가 된다.

 

anchor_y

중심점의 y 좌표를 나타낸다(0 .. rows-1). 만약 3 * 3 사각형 구조적 요소이면 anchor_y=1이 되고

5 * 5 사각형 구조적 요소이면 anchor_y=2가 된다.

 

shape

구조적 요소의 모양을 지정한다.

(a) CV_SHAPE_RECT : 사각형 구조적 요소

(b) CV_SHAPE_CROSS : 십자형 구조적 요소

(c) CV_SHAPE_ELLIPSE : 타원형 구조적 요소

(d) CV_SHAPE_CUSTOM : 사용자 정의 구조적 요소

 

cvCreateStructuringElementEx() 함수의 사용 예는 다음과 같다.

 

int element_shape = CV_SHAPE_RECT;

int pos = 1;

IplConvKernel* element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape);

 

cvErode 함수

 

침식연산을 수행하기 위한 함수이다.

 

void cvErode( CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

element

구조적 요소를 나타낸다. 만약 element=NULL이면 3 * 3 사각형 구조적 요소가 사용된다. IplConvKernel은 구조적 요소를 표현하는 구조체이다.

 

iterations

침식연산 수행 횟수를 지정한다.

열림 연산과 닫힘 연산

 

cvMorphologyEx 함수

 

팽창연산과 침식연산으로부터 확장된 연산 즉, 열림연산, 닫힘연산 그리고 기울기 연산 등을 수행하기 위한 함수이다.

 

void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1 );

 

src

원 영상을 나타낸다.

 

dst

목적 영상을 나타낸다.

 

temp

임시 영상을 나타내며 열림연산과 닫힘연산인 경우 NULL을 지정한다.

 

element

구조적 요소를 나타낸다. 만약 element=NULL이면 3 * 3 사각형 구조적 요소가 사용된다.

 

operation

다음 연산 중 하나를 지정한다.

(a) CV_MOP_OPEN : 열림연산

(b) CV_MOP_CLOSE : 닫힘연산

(c) CV_MOP_GRADIENT : 기울기 연산

(d) CV_MOP_TOPHAT : top hat 연산(e) CV_MOP_BLACKHAT : black hat 연산

 

iterations

연산 수행 횟수를 지정한다.

동영상 파일

 

cvCaptureFromFile() 함수

 

동영상 파일을 불러오는데 사용하는 함수이다.

 

CvCapture* cvCaptureFromFile( char* filename );

 

filename

동영상 파일의 이름을 나타낸다.

 

cvReleaseCapture() 함수

 

불러온 동영상에 대해 메모리를 해제하기 위해 사용하는 함수이다.

 

void cvReleaseCapture( CvCapture** capture );

 

capture

메모리 해제할 동영상을 나타낸다.

 

cvGrabFrame() 함수

 

동영상 파일(혹은 카메라)로부터 하나하나의 프레임을 잡는데(grab)사용하는 함수이다.

 

int cvGrabFrame( CvCapture* capture );

 

capture

재생할 출력할 동영상을 나타내며 cvGrabFrame() 함수가 호출될 때 마다 파일(혹은 카메라)로부터 한 프레임씩 잡아(grab) 내부 버퍼에 저장한다.

 

cvRetrieveFrame() 함수

 

cvGrabFrame() 함수로부터 잡은 프레임으로부터 영상을 얻어내는데 사용하는 함수이다.

 

IplImage* cvRetrieveFrame( CvCapture* capture );

 

capture

재생할 동영상을 나타내며 cvRetrieveFrame() 함수는 cvGrabFrame() 함수로부터 잡은 프레임으로부터 얻은 영상에 대한 포인터를 반환한다. 서 반환된 영상은 바로 메모리를 해제해서는 안 된다.

 

cvCreateVideoWriter() 함수

 

디스크에 동영상 파일을 생성하기 위한 함수이다. 동영상 파일이름과 코덱을 지정하고 그리고 fps와 프레임 크기를 지정한다.

 

CvVideoWriter* cvCreateVideoWriter( char* filename, int fourcc, double , CvSize frame_size );

 

filename

출력할 동영상의 파일 이름을 지정한다.

 

fourcc

프레임을 압축하기 위해 사용된 4-글자 코덱을 나타내는 코드를 설정한다. -1값을 지정하면 함수가 실행될 때 코덱을 선택할 수 있는 대화상자가 나타난다. 그렇지 않은 경우 CV_FOURCC 함수를 이용해 다음에서 코덱을 선택할 수 있다.

(a) CV_FOURCC('P', 'I', 'M', '1') = MPEG -1 codec

(b) CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec

(c) CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

(d) CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec

(e) CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

 

fps

초당 재생되는 프레임의 수를 설정한다.

 

frame_size

프레임 크기를 나타낸다.

 

cvWriteFrame() 함수

 

지정된 동영상 파일에 한 프레임 씩 출력한다.

 

int cvWriteFrame( CvVideoWriter* writer, IplImage* image );

 

writer

동영상 파일을 나타낸다.

 

image

프레임을 나타낸다.

 

cvReleaseVideoWriter() 함수

 

지정된 파일에 저장하는 것을 종료하고 저장 구조를 메모리에서 해제한다.

 

void cvReleaseVideoWriter( CvVideoWriter** writer );

 

wrtier

동여상 파일을 나타낸다.

 

cvQueryFrame() 함수

 

동영상 혹은 카메라로부터 프레임을 읽고 반환하는 함수이다.

 

IplImage* cvQueryFrame( CvCaptuer* capture );

 

capture

동영상 파일을 나타낸다.

 

cvQueryFrame() 함수는 cvGrabFrame() 함수와 cvRetrieveFrame() 함수를 동시에 실행하는 효과를 갖고 있다.

 

cvInitFont() 함수

 

글씨체를 초기화하는데 사용하는 함수이다.

 

void cvInitFont( CvFont* font, int font_face, double hscale, double vscale, double, italicScale = 0, int thickness=1);

 

font

폰트에 대한 포인터이다.

 

font_face

폰트 이름을 나타낸다.

() CV_FONT_HERSHEY_SIMPLEX - normal size s-serif font 보통의 글자 크기를 나타내며 산세리프 글씨체이다.

 

hscale

글자의 수평 스케일(horizontal scale)을 나타내며 1.0f이면 원래 글자의 넓이를 나타낸다.

 

vscale

글자의 수직 스케일(vertical scale)을 나타내며 1.0f이면 원래 글자의 높이를 나타낸다.

 

italicScale

글자의 기울어진 정도를 나타낸다. 0은 전혀 기울지 않은 폰트이고 1.0f45도 기운 폰트를 나타낸다.

 

thickness

글자의 굵기를 나타낸다.

 

cvPutText() 함수

 

텍스트를 영상에 추가한다. 어떤 영상에 어떤 색상의 텍스트를 어디에 추가할것인가를 지정한다.

 

void cvPutText( CvArr* img, char* text, CvPoint org, CvFont* font, int color );

 

img

입력영상을 나타낸다.

 

text

출력할 텍스트를 나타낸다.

 

org

텍스트를 출력할 좌표를 나타낸다.

 

font

폰트를 가리키는 포인터를 나타낸다.

 

color

텍스트의 색상을 지정한다.

 

다음은 텍스트 “I Love U"를 영상에 추가하기 위한 문장이다. 여기서 텍스트의 폰트는

cvPoint(10, 10이고 색상은 CV_RGB(200, 0, 0)로 지정한다.

 

cvPutText( image, "I Love U", cvPoint(10, 10), &font, CV_RGB(200, 0, 0) );

PC 카메라로부터 영상 다루기

 

cvCaptureFromCAM() 함수

 

PC카메라로부터 동영상을 캡쳐하는데 사용하는 함수이다.

 

CvCapture* cvCaptureFromCAM( int index );

 

index

사용할 카메라를 지정한다. 카메라가 1개인 경우 혹은 여러 개 중에서 특정한 카메라를 지정하지 않을 경우는 -1을 사용한다. 만약 2개인 경우 index값이 0이면 카메라를 선택할 수 있는 창이 나타난다.

 

cvCreateTrackbar() 함수

 

트랙 바를 만들고 지정된 윈도우에 부착한다.

 

int cvCreateTrackbar( char* trackbar_name, char* window_name, int* value, int count, CvTrackbarCallback on_change );

 

trackbar_name

트랙 바의 이름을 나타낸다.

 

window_name

트랙 바가 부착될 윈도우의 이름을 지정한다.

 

value

정수형 포인터로서 슬라이더의 위치를 나타낼 정수이다.

 

count

트랙 바의 최대 위치, 여기서 최소 위치는 0 이다.

 

on_change

트랙 바가 움직일 때 마다 호출하는 함수에 대한 포인터, 만약 호출되는 함수가 없으면 NULL이다.)

OpenCV를 이용한 얼굴인식 프로그램

 

cvCalcEigenObjects() 함수

 

입력 영상들에 대한 고유얼굴과 평균열상을 계산한다.

 

void cvCalcEigenObjects( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals );

 

nObjects

입력영상의 개수를 나타낸다.

 

input

입력영상에 대한 포인터를 가리킨다.

 

output

고유얼굴을 나타낸다.

 

ioFlags

입력/출력 플러그를 나타낸다. 입출력 플러그를 사용하지 않으면 0이다.

 

ioBufSize

입력/출력 버퍼 크기를 나타낸다.

 

userData

콜벡함수(callback functions)를 위해 필요한 모든 데이터를 포함하는 구조에 대한 포인터이다. 콜벡함수를 사용하지 않으면 0이다.

 

calcLimit

최대 고유얼굴 영상의 개수(calcLimit.max_iter)와 가장 큰 고유값에 대한 현재의 고유값의 비율에 대한 임계값(calcLimit.epsilon)을 지정한다.

 

avg

평균영상을 나타낸다.

 

eigVals

고유값을 나타낸다.

 

예를 들어, cvCalcEigenObjects() 함수의 사용 예는 다음과 같다.

 

cvCalcEigenObjects(M, images, eigenObjects, 0,0,0, &criteria, avg, eigVals);

 

이것은 M 개의 입력 영상에 대해 고유얼굴 영상 eigenObjects과 평균영상 avg을 계산한다.

여기서 criteriaCvTermCriteria 자료형의 변수로서 고유얼굴을 계산하는데 최대 반복횟수와 고유값에 대한 임계값을 지정한다.

 

cvTermCriteria() 함수

 

CvTermCriteria cvTermCriteria( int type, int max_iter, double epsilon );

 

type

CV_TERMCRIT_ITER(최대 반복횟수)CV_TERMCRIT_EPS(고유값에 대한 임계값)를 고려하고자 하는 경우 CV_TERMCRIT_ITER+CV_TERMCRIT_EPS처럼 지정한다.

 

max_iter

반복 최대 횟수를 지정한다.

 

epsilon

가장 큰 고유값에 대한 현재의 고유값의 비율에 대한 임계값을 지정한다.

 

예를 들어 cvTermCriteria() 함수의 사용 예는 다음과 같다.

 

cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 10, 0.05);

 

인수로서 10은 최대 반복횟수이고 0.05는 고유얼굴을 결정하는데 고유값에 대한 임계값을 나타내며 최대 고유값에 대한 현재의 고유값의 비율이 0.05보다 작으면 반복을 종료한다.

 

cvEigenDecomposite() 함수

 

입력영상을 고유얼굴 공간에 투영시켰을 때 분해계수(decomposition coefficients)를 계산한다.

 

void cvEigenDecomposite( IplImage* obj, int nEigObjs, void* eigInput, int ioFlags, void* userData, IplImage* avg, float* coeffs)

 

obj

입력영상을 나타낸다.

 

nEigObjs

고유얼굴 영상의 개수를 나타낸다.

 

eigInput

고유얼굴 영상에 대한 포인터를 나타낸다.

 

ioFlags

입력/출력 플러그를 나타낸다. 입출력 플러그를 사용하지 않으면 0이다.

 

userData

콜벡함수(callback functions)를 위해 필요한 모든 데이터를 포함하는 구조에 대한 포인터이다. 콜벡함수를 사용하지 않으면 0이다.

 

avg

평균영상을 나타낸다.

 

coeffs

분해계수를 나타낸다.

 

예를 들어, cvEigenDecomposite() 함수의 사용 예는 다음과 같다.

 

cvEigenDecomposite(newone, nEigens, eigenObjects, 0,0, avg, coeffs);

 

이것은 입력영상 newone을 고유얼굴 eigenObjects 공간에 투영시켰을 때 분해 계수 coeffs를 계산한다.

 

cvEigenProjection() 함수

 

고유얼굴 공간상에서 재구성된 영상을 얻는다. , 고유얼굴과 평균영상 그리고 분해계수로부터 재구성된 영상을 얻는다.

 

void cvEigenProjection( void* input_vecs, int eigenvec_count, int io_flags, void* userdata, float* coeffs, IplImgae* avg, IplImage* proj );

 

input_vecs

고유얼굴 영상에 대한 포인터를 나타낸다.

 

eigenvec_count

고유벡터의 개수를 나타낸다.

 

io_flags

입력/출력 플러그를 나타낸다. 입출력 플러그를 사용하지 안흥면 0이다.

 

userdata

콜벡함수(callback functions)를 위해 필요한 모든 데이터를 포함하는 구조에 대한 포인터이다. 콜벡함수를 사용하지 않으면 0이다.

 

coeffs

분해계수를 나타낸다.

 

avg

평균 영상을 나타낸다.

 

proj

고유얼굴 공간상에서 재구성된 영상을 나타낸다.

 

예를 들어, cvEigenProjection() 함수의 사용 예는 다음과 같다.

 

cvEigenProjection(eigenObjects, nEigens, 0, 0, coeffs, avg, proj);

 

이것은 고유얼굴 eigenObjects과 평균영상 avg 그리고 분해계수 coeffs로부터 재구성된 영상 proj을 얻는다.



출처 : www.opencv.co.kr

 

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

IplImage 구조체  (0) 2011.10.29
Open CV 초보자가 하는 실수들 모음..  (0) 2011.10.26
카메라 입력받기  (0) 2011.10.26
Open CV 설치 및 셋팅 (Visual 2010)  (0) 2011.10.25
Open CV 란?  (0) 2011.10.25
Posted by 아몰라