본문 바로가기

CLASS

[OpenCV] OpenCV 기초강좌 - 2편 : 카메라 입력받기

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

OpenCV_camera_VFW.zip

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

#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

  • J 2007.03.28 16:28

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

  • BlogIcon 강무진 2008.09.10 19:16

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

  • 안상우 2009.10.02 20:52

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

  • 이상준 2010.04.30 17:44

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

  • 미소미소 2012.02.21 18:58

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

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

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

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

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

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

    taehoon05@gmail.com

  • 익명 2013.09.05 18:12

    비밀댓글입니다

  • 지식은 사랑입니다 2015.11.07 14:14

    관리자의 승인을 기다리고 있는 댓글입니다