>> 연산자 재정의와 VideoCapture::read() 멤버 함수는 모두 카메라 또는 동영상 파일로부터 다음 프레임을 받아 와서 Mat 클래스 형식의 변수 image에 저장합니다. 사실 >> 연산자 재정의는 함수 내부에서 명시적으로 VideoCapture::read() 함수를 호출하는 형태로 구현되어 있습니다. 결국 VideoCapture::read() 함수와 >> 연산자 재정의가 하는 일은 완전히 같지만 사용하는 방법만 다른 형태입니다. 예를 들어 컴퓨터에 연결된 기본 카메라로부터 한 프레임의 정지 영상을 받아 오려면 다음과 같은 형태로 코드를 작성합니다.
VideoCapture cap(0); Mat frame1, frame2; cap >> frame1; // 1st frame cap.read(frame2); // 2nd frame
이 코드에서는 첫 번째 프레임 frame1은 VideoCapture::operator >>() 연산자 재정의 함수를 사용하여 받아 왔고, 두 번째 프레임 frame2는 VideoCapture::read() 함수를 사용하여 받았습니다. 참고로 이 책에서 제시하는 예제 코드에서는 대부분 VideoCapture::operator >>() 연산자 재정의를 이용하여 프레임을 받아 오는 방식을 사용합니다.
Note
앞서 코드 4-1에 나열한 VideoCapture 클래스 멤버 함수 중에는 VideoCapture::grab() 함수와 VideoCapture::retrieve() 함수가 있습니다. VideoCapture::grab() 함수는 카메라 장치에 다음 프레임을 획득하라는 명령을 내리는 함수이고, VideoCapture::retrieve()는 획득한 프레임을 실제로 받아 오는 함수입니다. 결국 VideoCapture::read() 또는 VideoCapture::operator >>() 연산자 함수는 VideoCapture::grab()과 VideoCapture::retrieve() 함수를 합쳐 놓은 것이라고 볼 수 있습니다.
만약 컴퓨터에 여러 대의 카메라를 연결하고 여러 카메라로부터 동시에 영상을 획득하고 싶다면 VideoCapture:: read() 함수를 쓰는 것보다 VideoCapture::grab()과 VideoCapture::retrieve() 함수를 따로 호출하여 사용하는 것이 좋습니다. 일반적으로 VideoCapture::retrieve() 함수는 VideoCapture::grab() 함수보다 수행 속도가 느린 편입니다. 그러므로 같은 시점의 사진을 획득할 때에는 여러 대의 카메라에 대해 차례대로 VideoCapture::grab() 함수를 호출한 후, 다시 VideoCapture::retrieve() 함수를 차례대로 호출하여 실제 프레임을 받아 오는 것이 좋습니다. 여러 대의 카메라 동기화를 고려하는 상황이 아니라면 VideoCapture::read() 함수 또는 >> 연산자 재정의를 사용하는 것이 편리합니다.