비디오 코덱

실시간 영상 프레임 읽어오기 : VideoCapture

케케_ 2024. 11. 27. 16:38

웹캡을 이용한 실시간 영상 사용하기

 

VideoCapture

: 프에임을 읽어오기 위해서 사용

: 비디오 처리의 핵심 역할을 하는 클래스

 

cv::VideoCapture::VideoCapture '변수이름';
cv::VideoCapture::VideoCapture ();
cv::VideoCapture::VideoCapture '변수이름'(const std::string& filename);
cv::VideoCapture::VideoCapture '변수이름'(int device);
  • 매개변수 : 파일 이름 또는 장치 번호
  • 장치 번호 (카메라 번호)
    • 0 : 내장 웹캠 카메라 번호
    • 0 : 데스크탑 같이 usb를 이용해 연결한 웹캡의 카메라 번호
    • 1 : 노트북에서 웹캡 추가할 경우
  • 변수이름 
    • 보통 capture를 줄여 cap으로 사용
    • 변수 cap: 카메라를 준비시킴, 픽셀 정보를 담지 않음
      • 픽셀 정보를 담는 변수는 따로 선언

 

- isOpened()

: 정상적 연결을 위한 확인 코드필요 

: 카메라 정보가 있으면 1, 없으면 0 반환

 

예제 코드

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    cv::VideoCapture cap(0);
    if(!cap.isOpened()) {
        std::cerr << "Error: Cannot open video file!" << std::endl;
        return -1;
    }

    cv::Mat frame;

    while (1)
    {
        cap >> frame; //프레임 읽기
        cv::imshow("camera img" , frame);

        if (cv::waitKey(1) == 27)   break;
    }

    return 0;
}
  • operator >> (연산자 오버로딩)
    • read()와 동일하게 다음 프레임을 읽음
      • 비디오의 다음 프레임을 읽어 Mat 객체로 반환
    • 코드 간결해짐
  • cv::waitKey(1) == 27
    • 1 : 실시간 처리에서 자주 사용
      • 1밀리초만 대기 -> 프레임 사이의 대기 시간이 거의 없어 비디오 스트리밍이나 실시간 작업에 적합
      • 높은 FPS 지원 => 거의 즉시 다음 프레임을 처리해 지연 최소와
      •  실시간 입력
    • 27 : esc키 누르면 종료

 

waitKey(시간) => 일단 비디오는 영상의 초당 프레임 수(FPS, Frame Per Second)에 기반해 계산

  • 대기 시간(ms) = 1000 / FPs
  • 예)
    • FPS가 30인 비디오 -> 1000 / 30 = 33.3333... ==> cv::waitKey(30)
    • FPS가 60인 비디오 -> 1000 / 60 = 16.6666... ==> cv::waitKey(16)

 

코드 결과 (웹캠 영상 캡쳐함)


해상도 변경도 해보려했지만,

내가 쓰는 맥북이 720p 지원이므로,,,

넘긴다..

 

 

참고 블로그

https://diyver.tistory.com/56

 

[C++ opencv] 카메라, 웹캠 영상 입력받기 VideoCapture()

본문 목표 OpenCV를 사용하는 목적은 여러가지가 있을 수 있다. 정지되어 있는 사진, 움직이는 물체를 담은 동영상, 실시간 카메라 영상 등 다양하게 사용할 수 있는데, 이번에는 실시간 카메라 영

diyver.tistory.com