이 글에서는 OpenCV를 사용하여 기본 카메라가 아닌 다른 카메라에서 영상을 캡처하는 방법을 알아봅니다. 다행히 다른 카메라에 접근하는 방법은 기본 카메라에 접근하는 방식과 거의 동일합니다. 유일한 차이점은 VideoCapture cap(0) 대신 원하는 카메라 번호를 직접 지정해야 한다는 점입니다.
카메라 번호는 USB 포트에 연결된 순서를 따릅니다. 예를 들어 카메라가 세 번째 USB 포트에 연결되어 있다면 해당 카메라의 번호는 3이 됩니다. 이러한 방식을 활용하면 웹캠 여러 대나 외부 카메라 모듈을 상황에 맞게 선택적으로 사용할 수 있습니다.
다음 예제 프로그램은 세 번째 카메라에 접근하여 카메라에서 촬영한 실시간 영상 스트림을 화면에 출력합니다.
예제 코드
#include<opencv2/opencv.hpp>//VideoCapture 클래스를 사용하기 위한 OpenCV 헤더//
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat myImage;//프레임을 저장할 행렬 선언//
namedWindow("Video Player");//영상을 표시할 윈도우 생성//
VideoCapture cap(3);//세 번째 카메라에서 프레임 스트림을 캡처할 객체 선언//
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(3) 부분이 핵심입니다. 인덱스 0은 일반적으로 시스템의 기본 카메라를 의미하며, 여기서는 3을 지정하여 세 번째 USB 포트에 연결된 카메라의 영상 스트림을 가져옵니다. cap.isOpened()로 카메라가 정상적으로 열렸는지 먼저 확인하고, 열리지 않았다면 오류 메시지를 출력한 후 프로그램을 종료합니다.
무한 루프 안에서는 cap >> myImage 구문으로 프레임을 하나씩 읽어오고, imshow()로 화면에 출력합니다. waitKey(25)는 각 프레임 사이에 25밀리초의 지연 시간을 두어 영상이 자연스럽게 재생되도록 하며, 사용자가 Esc 키(ASCII 코드 27)를 누르면 루프를 빠져나갑니다. 마지막으로 cap.release()를 호출하여 카메라 버퍼 메모리를 해제하고 리소스를 정리합니다.
실행 결과
