[초급] OpenCV 초보를 위한 강좌 - 2편 : 카메라 입력받기

2005/11/06 22:32

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


>> 소스코드 결과 화면
  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 );


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

t9t9 Research/OpenCV , , ,

  1. Blog Icon
    J

    안녕하세용^^;오픈씨브이 까페서 활동 하시는 분 맞나요?? opencv 자료 찾다가 이렇게왔다가 갑니당.. 좋은 정보 감사 해용 ㅋ

  2. 안녕하세요.. 티구티구님..저는 opencv 카페에서 많을 것을 배우면서 영상처리 분야에 흥미를 가지고 있는 대학생입니다.. 다름이 아니오라.. 질문하고 싶은 것이 있어서 이렇게 글 올립니다..
    제가 캠을 마이크로 소프트 제품인 nx-6000 를 사용하고 있는데..... 기본 카메라 입력받는 소스를 돌리면.. 화면이 회색으로 나오고 입력을 못받는데.. 도대체 모르겠어서.. 이렇게 글올립니다.. 제발 답변 부탁드립니다..ㅠㅠ cvRetrieveFrame( capture ) 이 함수부분이 NULL값으로 리턴을 하는거같은데.. 왜 이럴까요? 티구티구님이.. 이 캠을 사용해서.. 실험하는것을 봐서.. 이렇게 안면몰수하고.. 글올립니다.. 부디 자비롭게.. 답변 부탁드립니다.. 그럼 수고하시고.. 좋은카페 만들어주셔서 감사합니다.
    메일주소는 embarko@naver.com 입니다`^^

  3. Blog Icon
    안상우

    저도 회색창이 뜸니다...ㅠ
    NX-3000을 쓰고있는데...ㅠ
    왜이런거죠..?ㅠ

  4. Blog Icon
    이상준

    안녕하세요. 티구티구님의 코드를 받아서 컴파일 후 다른 컴퓨터에서 실행하여 보니 화면이 검게 출력되고 나오질 않습니다. vidcap32.exe를 실행하였을 경우는 정상적으로 출력이 되구요. 어떻게하면 나올까요? pc의 운영체제는 vista(32bit)입니다.

  5. Blog Icon
    미소미소

    좋은 자료 덕분에 많은 도움이 되었습니다 감사합니다.

    한가지 여쭈어보고 싶은게 있는데

    맨 처음 캠출력 화면을 하면 어떤 캠을 연결할지 선택하는 창이 뜨는데

    그 선택을 잘못해서 현재 캠 실행이 안되는데

    그 선택창을 어디서 변경 가능하신지 혹시 알고 계시다면

    조언좀 부탁드립니다... ^^

    taehoon05@gmail.com