Mat::at() 함수는 템플릿 함수로 정의되어 있기 때문에 Mat::at() 함수를 사용할 때에는 행렬 원소 자료형을 명시적으로 지정해야 합니다. 예를 들어 Mat 행렬의 타입이 CV_8UC1이면 uchar 자료형을 지정하고, CV_32FC1 타입의 행렬이라면 float 자료형을 지정해야 합니다. 만약 CV_8UC3 타입을 사용하는 3채널 컬러 영상이라면 OpenCV에서 정의한 Vec3b 자료형을 명시해서 사용합니다.10 Mat::at() 함수의 첫 번째 인자는 참조할 원소의 행 번호이고, 이는 (x, y) 좌표계에서 y 좌표에 해당합니다. Mat::at() 함수의 두 번째 인자에는 참조하려는 원소의 열 번호를 전달합니다. 그러므로 Mat 타입의 변수 img에 그레이스케일 영상이 저장되어 있을 경우, (x, y) 좌표 픽셀 값을 참조하려면 img.at<uchar>(y, x) 형태로 코드를 작성해야 합니다. 만약 Mat::at() 함수로 전달된 인자의 좌표 (x, y)가 행렬 크기를 벗어날 경우에는 에러가 발생하므로 주의해야 합니다.
Mat::at() 함수를 사용하여 행렬의 원소 값을 참조하는 방법을 예제 코드와 함께 알아보겠습니다. 일단 모든 원소 값이 0으로 초기화된 CV_8UC1 타입의 행렬 mat1을 정의하고, 이 행렬의 모든 원소 값을 1만큼 증가시키는 예제 코드를 살펴보겠습니다.
Mat mat1 = Mat::zeros(3, 4, CV_8UC1); for (int j = 0; j < mat1.rows; j++) { for (int i = 0; i < mat1.cols; i++) { mat1.at<uchar>(j, i)++; } }
10 Vec3b 타입은 uchar 자료형 세 개로 이루어진 데이터 타입입니다. Vec3b 타입에 대해서는 3.3.1절에서 자세히 설명합니다.