ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mat 데이터 #7
    OpenCV (C#) 2024. 8. 5. 17:48

    조밀 행렬(dense matrix)

     행렬이나 배열을 저장하기위한 데이터 타입이다. 행렬과 배열의 차이는 행렬은 2차원 배열을 의미하며, 배열은 1, 2, 3차원 전부 가능하다. 이미지는 x, y 좌표로 구성되므로, 행렬로 정의한다.

     

     Mat 클래스는 헤더와 데이터 포인터로 구성되어 있다. 헤더는 Mat 클래스에 대한 정보, 데이터포인터에는 각 데이터가 남긴 메모리 주소 정보가 담겨 있다.

     

     Mat 데이터는 클래스이며, N차원 조밀형 행렬이다. 즉 다차원 배열을 저장 할 수 있다. 조밀이란 배열의 모든 값이 의미있는 값으로 채워져 있는 값으로 채워져 있는 배열이라는 뜻이다. 배열 값이 0이더라도 메모리에 할당을 해야된다.

     

    참고로 조밀 형식을 피하기위해 0이 아닌 항목만 저장해 놓는 형태로 희소행렬이 있다. SparseMat 클래스로 표현한다.

     

    Mat 클래스 - N차원 밀집 행렬

     래스터 주사(Raster Scan)를 이해해야 한다. 행렬의 상단부분에서 수평 주사선을 위에서부터 아래로 한 줄씩 내려가면서 데이터를 순차적으로 저장하고 불러오는 것을 의미한다. (0, 0)에서 (0, max)의 순서로 값을 저장하고, 다음 데이터는 (1, 0)에서 (1, max)로 값을 저장하고 불러온다.

     행과 열의수를 row와 cols로 나타낸다. 행렬 데이터 유형을 나타내는 MayType은 정밀도와 채널 수를 나타낸다. 그러므로 Mat 클래스는 단일 채널 또는 다중 채널을 사용하는 행렬을 나타낸다. 실수나 복소스 값이 저장된 벡터나 행렬을 저장해 연산을 위한 행렬값으로 사용하거나 색상 이미지, 흑백 이미지, 히스토그램, 복셀, 점구름등을 저장하는 용도로 사용된다. 또한 Mat 클래스는 자체 메모리를 관리하는 클래스가 있으며, 이 클래스는 관리되지 않는 리소스를 해제한다.

     

    Mat 클래스 메모리 레이아웃

     Mat 클래스 배열 M의 데이터 메모리 레이아웃은 M.Step[] 배열에 의해서 정의되며 요소에 대한 주소는 i0,i1,i M.dims-1 순서로 배치된다.

     

    address(Mi0, i1, ... iM.dims-1) = M.data + m.step[0] * i0 + M.step[1] * i1 + ... M.step[M.dims-1] * iM,dims - 1

     

    2차원 배열인 경우, 다음과 같은 수식으로 표현 된다.

    address(Mi0, i1) = M.data + M.step[0] * i0 + M.step[1] * i1

     

     이 수식을 통해 2차원 배열은 행단위로 저장되며, 3차원 배열은 평면 단위로 저장 된다는 사실을 알 수 있다. 배열 요소의 크기(Byte)는 M.ElemSize()와 같다. 배열 M에 저장된 데이터가 단일 데이터나 다중 데이터일 수 있는데, 단일 데이터인 경우 N차원 단일 채널 배열로 인식하며, 다중 데이터일 경우 N-1차원 다중 채널 배열로 인식한다.

     

    배열 요소 크기를 사용해 메모리에 할당된 크기를 판단할 수 있다. 2차원 CV_8UC1(8비트, 1채널)은 8비트 정수형으로 구성된 단일 채널 2차원 배열이다. 1바이트(8비트)의 요소가 한개의 채널만 구성하고 있으므로, 배열 요소의 크기는 1바이트이다. 2차원 CV_64C3(64비트, 3채널)의 요소크기는 8바이트 곱하기 3해서 24바이트라는것을 알 수 있다.

     

     

     

Designed by Tistory.