더북(TheBook)

이 코드에서 바깥쪽 for 반복문은 행렬의 전체 행에 대한 반복이고, 변수 j는 각 행의 번호를 나타냅니다. 그러므로 mat1.ptr<uchar>(j) 코드는 j번째 행 원소의 시작 주소를 반환합니다. 이 주소를 포인터형 변수 p에 저장하면 이후 p를 1차원 배열처럼 사용하여 해당 행의 원소에 접근할 수 있습니다. 즉, j번째 행의 0번째 열 원소는 p[0]이고, 1번째 열 원소는 p[1]입니다. j번째 행의 맨 마지막 열에 해당하는 원소는 p[mat1.cols - 1] 형식으로 접근할 수 있습니다. Mat::ptr() 함수를 통해 얻은 행의 시작 주소를 이용하여 각 행의 모든 픽셀을 1차원 배열처럼 접근할 경우, 행렬의 가로 크기를 벗어나는 위치에 접근하지 않도록 주의해야 합니다.

이러한 Mat::ptr() 함수 동작을 그림으로 표현하면 그림 3-7처럼 나타낼 수 있습니다. 그림 3-7에서 변수 puchar* 타입으로 선언된 포인터 변수이고, mat1.ptr<uchar>(0) 코드는 0번째 행의 시작 주소를 가리킵니다. 0번째 행의 시작 주소를 p에 저장하였으므로 (0, 0) 위치의 원소는 *p 또는 p[0] 형태로 접근할 수 있습니다. 그리고 0번째 행의 i번째 원소는 *(p+i) 또는 p[i] 형태로 접근 가능합니다. 나머지 행에 대해서도 각 행의 시작 주소를 얻은 후, 포인터 연산을 통해 각 행의 모든 원소에 접근할 수 있습니다.

▲ 그림 3-7 Mat::ptr( ) 함수의 동작 방식

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