더북(TheBook)

MatIterator_ 반복자를 사용하여 행렬의 모든 원소에 접근하는 방법을 예제 코드를 통해 알아보겠습니다. CV_8UC1 타입의 행렬 mat1이 있다 가정하고, MatIterator_ 반복자를 사용하여 mat1 행렬의 모든 원소 값을 1씩 증가시키는 예제 코드는 다음과 같습니다.

for (MatIterator_<uchar> it = mat1.begin<uchar>(); it != mat1.end<uchar>(); ++it) {
  (*it)++;
}

이 예제 코드의 for 반복문에서는 MatIterator_<uchar> 타입의 변수 it를 선언하고, mat1.begin<uchar>() 함수의 반환값으로 초기화하였습니다. 그리고 it 값이 mat1.end<uchar>()와 같아질 때까지 위치를 증가시키면서, 해당 위치 원소 값을 1씩 증가시킵니다. 이때 반복자 변수 it가 가리키는 원소 값을 참조하기 위해 (*it) 형태로 코드를 작성한다는 점을 기억하기 바랍니다.

앞의 반복자 예제 코드에서는 행렬 mat1의 가로 및 세로 크기를 참조하는 코드는 찾아볼 수 없습니다. 즉, MatIterator_ 반복자를 사용하면 행렬의 가로 또는 세로 크기에 상관없이 행렬의 모든 원소를 안전하게 방문할 수 있습니다. 다만 MatIterator_ 반복자를 사용하는 방법은 동작 속도 면에서 Mat::ptr() 사용 방법보다 느린 편이고, Mat::at() 함수처럼 임의의 위치에 자유롭게 접근할 수 없어서 사용성이 높지 않은 편입니다.

지금까지 설명한 세 가지 행렬 원소 참조 방법을 사용하여 행렬 원소 값을 1씩 증가시키는 예제 코드를 코드 3-10에 한꺼번에 나타냈습니다. 코드 3-10의 MatOp4() 함수에서는 모든 원소 값이 0으로 초기화된 CV_8UC1 타입의 행렬 mat1을 정의하고, Mat::at() 함수와 Mat::ptr() 함수, 그리고 MatIterator_ 반복자를 사용하여 모든 행렬 원소 값을 1씩 증가시킵니다. 그 결과 MatOp4() 함수가 종료되는 시점에 mat1 행렬을 출력해 보면 모든 원소 값이 3으로 출력되는 것을 확인할 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.