본문 바로가기

IT

OpenCV VideoCapture 클래스 이해 및 활용

OpenCV VideoCapture 클래스 이해 및 활용
실시간 영상 처리의 핵심 클래스인 OpenCV VideoCapture 클래스는 
웹캠, 동영상 파일, IP카메라 스트림 등 다양한 영상 소스를 다루는 핵심 인터페이스예요.

 

penCV VideoCapture 클래스 이해 및 활용


영상 처리의 시작은 VideoCapture에서 시작된다고 해도 과언이 아니예요.

 

VideoCapture란 무엇인가요?

cv::VideoCapture는 영상 소스를 불러오는 데 사용하는 클래스예요.

이 클래스는 카메라 번호(예: 0, 1), 영상 파일 경로,

혹은 RTSP 스트림 주소 등을 받아서 프레임을 하나씩 읽어올 수 있게 해줘요.

실시간 웹캠 영상 처리뿐만 아니라,

저장된 동영상을 분석하거나 네트워크 영상 스트림을 처리할 때도

모두 이 클래스를 활용해요.

 

생성자나 .open() 메서드로 장치 또는 파일을 연결하고,

isOpened()로 정상 연결 여부를 확인하는 것이 일반적인 패턴이에요.

 

cv::VideoCapture cap(0); // 0번 웹캠
if (!cap.isOpened()) {
    std::cerr << "카메라를 열 수 없습니다.\n";
}

프레임 읽기와 루프 구성

연결된 영상 소스로부터 프레임을 읽으려면 .read() 함수나 >> 연산자를 사용해요.

일반적으로 while 루프 안에서 프레임을 반복해서 읽고,

실시간 처리하거나 출력하게 되죠.

 

프레임이 비어있지 않은지 확인하고,

특정 키 입력(예: ESC 키)을 감지하여 루프를 빠져나오는 식으로 구성돼요.

이 기본 구조는 실시간 영상 처리의 가장 핵심적인 틀이에요.

 

cv::Mat frame;
while (true) {
    cap >> frame;
    if (frame.empty()) break;
    cv::imshow("Frame", frame);
    if (cv::waitKey(1) == 27) break; // ESC 키로 종료
}

영상 소스에 따른 활용 방법 차이

VideoCapture는 다양한 입력을 처리할 수 있어요.

숫자 인자는 웹캠이고, 문자열 경로는 동영상 파일, URL은 IP 카메라 스트림이에요.

예를 들어, cap.open("video.mp4")는 파일을 열고,

cap.open("rtsp://...")는 실시간 네트워크 스트림을 가져올 수 있어요.

 

각 소스마다 네트워크 지연, 코덱, FPS 등이 달라지므로, 설정 값을 꼭 점검해야 해요.

 

cv::VideoCapture cap("sample_video.mp4");
if (!cap.isOpened()) {
    std::cerr << "영상 파일을 열 수 없습니다.\n";
}

프레임 속성 제어와 조회

VideoCapture는 영상의 속성값을 확인하거나 설정할 수 있는 메서드들을 제공해요.

대표적으로 .get()과 .set()을 사용해서 해상도, FPS, 밝기 등을 다룰 수 있어요.

 

하지만 모든 장치나 파일에서 설정이 적용되는 것은 아니므로, 지원 여부를 확인해야 해요.

특히 저장을 염두에 두고 있을 경우에는 .

get(CAP_PROP_FRAME_WIDTH)와 .get(CAP_PROP_FRAME_HEIGHT)로

해상도를 미리 알아두는 것이 중요해요.

 

double width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
double height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
double fps = cap.get(cv::CAP_PROP_FPS);
std::cout << "해상도: " << width << "x" << height << ", FPS: " << fps << "\n";

자원 해제와 종료 처리

영상 캡처를 마쳤다면 반드시 release()로 장치를 해제해야 해요.

윈도우 시스템에서는 이를 호출하지 않으면 다음 실행에서 카메라를 열 수 없는 경우도 생겨요.

 

또, 생성한 윈도우는 destroyAllWindows()를 통해 깔끔하게 닫아줘야

메모리 누수나 잔상 문제를 방지할 수 있어요.

이 종료 처리는 항상 프로그램의 마지막 단계에서 넣어주는 습관을 들이면 좋아요.

 

cap.release();
cv::destroyAllWindows();

 

 

이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~

OpenCV VideoCapture 클래스 이해 및 활용.mp3
3.60MB