이 글에서는 기본(default) 카메라에 접근하여 해당 카메라의 비디오 스트림을 화면에 출력하는 방법을 알아봅니다. 노트북의 경우 내장 웹캠이 일반적으로 기본 카메라로 인식되며, 데스크톱의 경우 카메라가 연결된 시리얼 포트의 순서에 따라 기본 카메라가 결정됩니다. 기본 웹캠에서 비디오 스트림을 캡처할 때는 카메라의 세부 사양이나 모델 정보를 알 필요가 없으며, 단지 카메라가 제대로 연결되어 있는지만 확인하면 됩니다.
실시간 비디오 스트림 캡처 예제
다음 프로그램은 기본 카메라로부터 비디오 스트림을 받아 실시간으로 화면에 표시합니다.
#include<opencv2/opencv.hpp>//VideoCapture 클래스를 사용하기 위한 OpenCV 헤더//
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat myImage;//프레임을 저장할 행렬 선언//
namedWindow("Video Player");//비디오를 출력할 창 생성//
VideoCapture cap(0);//기본 카메라에서 프레임 스트림을 캡처하는 객체 선언//
if (!cap.isOpened()){ //비디오 스트림을 찾지 못하면 오류 메시지 출력//
cout << "No video stream detected" << endl;
system("pause");
return -1;
}
while (true){ //비디오를 계속 보여주기 위한 무한 루프//
cap >> myImage;
if (myImage.empty()){ //비디오 프레임이 감지되지 않으면 루프 종료//
break;
}
imshow("Video Player", myImage);//현재 프레임을 화면에 출력//
char c = (char)waitKey(25);//25밀리초의 프레임 처리 시간 확보 및 종료 조건 검사//
if (c == 27){ //'Esc' 키가 입력되면 루프 종료//
break;
}
}
cap.release();//버퍼 메모리 해제//
return 0;
}
코드 설명
VideoCapture cap(0) : VideoCapture 클래스의 객체를 생성하며, 인자 0은 기본 카메라를 의미합니다. 여러 대의 카메라가 연결된 경우 1, 2 등의 값을 사용하여 다른 카메라를 선택할 수 있습니다.
namedWindow("Video Player") : 비디오 스트림을 표시할 창을 생성합니다.
cap.isOpened() : 카메라가 정상적으로 열렸는지 확인합니다. 카메라를 찾지 못하면 오류 메시지를 출력하고 프로그램을 종료합니다.
while(true) 루프 : cap >> myImage 구문을 통해 카메라의 각 프레임을 Mat 행렬에 저장하고, imshow()로 화면에 출력합니다. 프레임이 비어 있거나 'Esc' 키(ASCII 코드 27)가 입력되면 루프를 빠져나옵니다.
cap.release() : 사용이 끝난 카메라 자원과 버퍼 메모리를 해제합니다.
이 프로그램을 실행하면 모니터에 기본 카메라의 실시간 비디오 스트림이 표시되며, 'Esc' 키를 누르면 프로그램이 정상적으로 종료됩니다.
실행 결과
