Mat::ptr() 함수를 사용하여 픽셀 값에 접근하는 방법은 행 단위로 행렬 원소를 참조하는 경우에 유용합니다. 일반적으로 for 반복문을 이용하여 행렬의 모든 원소를 참조하는 경우, Mat::ptr() 함수를 사용하는 방법이 앞서 설명한 Mat::at() 함수 사용 방법보다 빠르게 동작합니다. 다만 행 단위로 연산을 수행하는 것이 아니라 임의 좌표 원소에 빈번하게 접근해야 하는 경우라면 Mat::at() 함수를 사용하는 것이 편리합니다.
MatIterator_ 반복자 사용 방법
앞서 설명한 Mat::at() 또는 Mat::ptr() 함수를 사용하여 행렬의 원소를 참조할 경우, 함수 인자로 전달된 값이 행렬의 크기를 벗어나면 에러가 발생합니다. 그러므로 프로그램 코드를 작성할 때 사용자가 행렬 또는 영상의 크기를 충분히 고려해야 하며, 주의하지 않으면 예기치 않게 프로그램이 종료될 수 있습니다. 이러한 단점을 해소하기 위해 OpenCV는 반복자(iterator) 개념을 도입하여 행렬 원소를 참조할 수 있는 방법을 제공합니다. 즉, Mat 행렬 원소 참조를 위한 반복자 변수를 만들어서 행렬 크기에 상관없이 행렬 전체 원소를 차례대로 참조하는 방식입니다.
Mat 클래스와 함께 사용할 수 있는 반복자 클래스 이름은 MatIterator_입니다. MatIterator_ 클래스는 템플릿으로 정의된 클래스이므로 실제 사용할 때에는 Mat 행렬 타입에 맞는 자료형을 명시하여 사용해야 합니다. MatIterator_ 클래스를 사용하는 방식은 C++의 반복자 사용 방법과 유사합니다. Mat::begin() 함수를 이용하여 행렬의 첫 번째 원소 위치를 얻을 수 있고, Mat::end() 함수를 이용하여 마지막 원소 바로 다음 위치를 얻을 수 있습니다.