[초급] OpenCV 초보를 위한 강좌 - 2편 : 카메라 입력받기
이번 강좌에서는 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
'Research > OpenCV' 카테고리의 다른 글
| [중급] 윤곽(contour) 추출, 에지(edge) 추출 강좌 (0) | 2006/01/03 |
|---|---|
| [초급] OpenCV 를 이용한 영상 이진화(Binarization) 강좌 (2) | 2005/11/11 |
| [초급] OpenCV 초보를 위한 강좌 - 2편 : 카메라 입력받기 (5) | 2005/11/06 |
| 입력 받은 영상 AVI 로 저장하기 추가 소스 - DirectX 버전 (1) | 2005/11/05 |
| [소스] OpenCV 기본 셋팅 소스 for VC++ 6.0 & VS.Net (0) | 2005/11/04 |
| [초급] OpenCV 초보를 위한 강좌 - 1편 : 설치하기 (6) | 2005/11/03 |
OpenCV_camera_VFW.zip
안녕하세용^^;오픈씨브이 까페서 활동 하시는 분 맞나요?? opencv 자료 찾다가 이렇게왔다가 갑니당.. 좋은 정보 감사 해용 ㅋ
안녕하세요.. 티구티구님..저는 opencv 카페에서 많을 것을 배우면서 영상처리 분야에 흥미를 가지고 있는 대학생입니다.. 다름이 아니오라.. 질문하고 싶은 것이 있어서 이렇게 글 올립니다..
제가 캠을 마이크로 소프트 제품인 nx-6000 를 사용하고 있는데..... 기본 카메라 입력받는 소스를 돌리면.. 화면이 회색으로 나오고 입력을 못받는데.. 도대체 모르겠어서.. 이렇게 글올립니다.. 제발 답변 부탁드립니다..ㅠㅠ cvRetrieveFrame( capture ) 이 함수부분이 NULL값으로 리턴을 하는거같은데.. 왜 이럴까요? 티구티구님이.. 이 캠을 사용해서.. 실험하는것을 봐서.. 이렇게 안면몰수하고.. 글올립니다.. 부디 자비롭게.. 답변 부탁드립니다.. 그럼 수고하시고.. 좋은카페 만들어주셔서 감사합니다.
메일주소는 embarko@naver.com 입니다`^^
저도 회색창이 뜸니다...ㅠ
NX-3000을 쓰고있는데...ㅠ
왜이런거죠..?ㅠ
안녕하세요. 티구티구님의 코드를 받아서 컴파일 후 다른 컴퓨터에서 실행하여 보니 화면이 검게 출력되고 나오질 않습니다. vidcap32.exe를 실행하였을 경우는 정상적으로 출력이 되구요. 어떻게하면 나올까요? pc의 운영체제는 vista(32bit)입니다.
좋은 자료 덕분에 많은 도움이 되었습니다 감사합니다.
한가지 여쭈어보고 싶은게 있는데
맨 처음 캠출력 화면을 하면 어떤 캠을 연결할지 선택하는 창이 뜨는데
그 선택을 잘못해서 현재 캠 실행이 안되는데
그 선택창을 어디서 변경 가능하신지 혹시 알고 계시다면
조언좀 부탁드립니다... ^^
taehoon05@gmail.com