'2011/10/30'에 해당되는 글 5건

  1. 2011.10.30 키보드 이벤트 처리
  2. 2011.10.30 문자 출력 1
  3. 2011.10.30 선, 사각형, 원, 타원 그리기
  4. 2011.10.30 카메라 입력받기
  5. 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);

}


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

이진화하기  (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 아몰라
이전버튼 1 이전버튼