OpenCV에서 Mat 클래스는 이미지를 저장하는 데 사용되는 행렬(matrix) 객체를 나타냅니다. 이미지 파일을 불러오는 것 외에도, Mat 객체를 직접 선언하여 원하는 형태의 행렬을 만들 수 있습니다.
Mat 객체 선언 절차
OpenCV 네이티브 라이브러리 로드 — OpenCV 라이브러리를 사용해 Java 코드를 작성할 때 가장 먼저 해야 할 일은
loadLibrary()메서드를 통해 OpenCV의 네이티브 라이브러리를 로드하는 것입니다.Mat 클래스 인스턴스화 — 다양한 생성자 중 하나를 사용하여 Mat 클래스의 인스턴스를 생성합니다. 행렬의 크기, 데이터 타입, 초기값 등을 지정할 수 있습니다.
메서드를 활용한 행렬 값 설정 —
row()또는col()메서드에 인덱스 값을 전달하면 행렬의 특정 행이나 열을 가져올 수 있습니다.setTo() 메서드로 값 지정 — 가져온 행이나 열에 대해
setTo()메서드의 여러 변형 중 하나를 사용하여 원하는 값을 설정할 수 있습니다.
예제 코드
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;
public class CreatingMat {
public static void main(String[] args) {
// 핵심(core) 라이브러리 로드
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 5x5 크기의 행렬 생성 (초기값 0)
Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));
// 값 추가
Mat row0 = matrix.row(0);
row0.setTo(new Scalar(1));
Mat col3 = matrix.col(3);
col3.setTo(new Scalar(3));
// 행렬 출력
System.out.println("행렬 데이터:\n" + matrix.dump());
}
}실행 결과
행렬 데이터: [ 1, 1, 1, 3, 1; 0, 0, 0, 3, 0; 0, 0, 0, 3, 0; 0, 0, 0, 3, 0; 0, 0, 0, 3, 0 ]
코드 설명
위 예제에서는 CvType.CV_8UC1을 사용하여 8비트 부호 없는 정수형 단일 채널 행렬을 생성했습니다. 생성자의 마지막 인자인 new Scalar(0)은 모든 요소를 0으로 초기화합니다.
그다음 row(0)으로 첫 번째 행을 가져와 모든 값을 1로 설정하고, col(3)으로 네 번째 열(인덱스 3)을 가져와 모든 값을 3으로 설정합니다. 결과적으로 첫 번째 행은 모두 1이고, 네 번째 열은 모두 3인 행렬이 완성됩니다. 교차 지점인 (0, 3) 위치의 값은 나중에 설정된 3이 유지됩니다.
마지막으로 dump() 메서드를 사용하면 행렬의 전체 내용을 문자열 형태로 손쉽게 확인할 수 있어 디버깅 시 매우 유용합니다.