[OpenCV] Mat 클래스 – 3. at, ptr, MatIterator_

[OpenCV] Mat 클래스 – 3. at, ptr, MatIterator_

이번 글에서는 Mat 클래스의 at, ptr, 반복자에 대해 알아보겠습니다.

Mat::at

영상의 픽셀 값에 접근하기 위해서는 Mat 클래스의 at함수를 사용 합니다.

template<typename _Tp> _Tp& at(int row, int col);

Mat::at 함수의 사용 예제는 아래와 같습니다.

Mat img = Mat( 3, 4, CV_8UC1, Scalar( 0 ) );
unsigned char ucPixel = img.at<uchar>( 2, 1 );

이미지 상으로 아래와 같습니다.

Mat::ptr

원소 값에 접근하기 위해 아래 함수를 사용 할 수 있습니다.

template<typename _Tp> _Tp* ptr(int row, int col);

Mat::ptr 함수의 사용 예제는 아래와 같습니다.

Mat img = Mat( 3, 4, CV_8UC1, Scalar( 0 ) );
unsigned char *p0 = img.ptr<uchar>( 0 );
unsigned char *p1 = img.ptr<uchar>( 1 );
unsigned char *p2 = img.ptr<uchar>( 2 );

이미지 상으로 아래와 같습니다.

만약 (1,2) 위치에 접근하고 싶다면 p1[2]로 접근해야 합니다.

일반적으로 ptr 함수는 at 함수보다 빠르게 작동합니다. at 은 좌표를 입력해야 하는 경우에, ptr의 경우엔 행단위 접근할 때 용이합니다.

Mat 반복자

C++ STL 컨테이너의 반복자처럼 Mat 클래스에도 반복자가 있습니다.

template<typename _Tp> class MatIterator_;

반복자 사용 예시는 아래와 같습니다.

Mat img = Mat( 3, 4, CV_8UC1, Scalar( 0 ) );
for ( MatIterator_<uchar> itr = img.begin<uchar>() ; itr != img.end<uchar>() ; itr++ )
{
	// todo something ...
}

해당 방식은 첫번째 원소에서 마지막 원소까지 참조 하는 방식인데, ptr보다 느리며, at보다 사용 편의성은 있지 않습니다.

Mat이 계속 길어지네요. 다음 글에서는 마지막으로 Mat 클래스의 연산에 대해 알아보겠습니다.