출처 - 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 );
'프로그래밍 기초 > 영상처리' 카테고리의 다른 글
문자 출력 (1) | 2011.10.30 |
---|---|
선, 사각형, 원, 타원 그리기 (0) | 2011.10.30 |
파일에서 영상읽기 및 화면에 출력하기 (0) | 2011.10.30 |
IplImage 구조체 (0) | 2011.10.29 |
Open CV 초보자가 하는 실수들 모음.. (0) | 2011.10.26 |