Computer Science/computer vision

[opencv/c++] 메모리공간에 배열 데이터 할당하는 방법 (using Mat)

yooj_lee 2021. 2. 22. 22:55
300x250

이화여자대학교 OpenSWProject 수업을 정리한 글입니다.

Mat

  • C++ OpenCV에서 제공하는 n차원 dense array 클래스
  • 실수 혹은 허수 값의 벡터와 행렬값을 저장하기 위함. (ex. 흑백, 컬러 이미지 등)

 

 

How to allocate new array data

  • Using Mat Constructors
    1. Mat::Mat()
    2. Mat::Mat(int rows, int cols, int type)
    3. Mat::Mat(Size size, int type)
    4. Mat::Mat(Size size, int type, const Scalar& s)
    5. Mat::Mat(int rows, int cols, int type, const Scalar& s)
  • Using create()
    1. Mat::create(int rows, int cols, int type)
    2. Mat::create(Size size, int type)

  cf.) 용어 정리
      - rows: 2차원 배열에서의 행의 개수
      - cols: 2차원 배열에서의 열의 개수
      - type: 배열 타입 (배열이 담을 수 있는 원소 타입을 지정해줌. 몇비트인지 unsigned인지 signed인지 등)
      - s: 배열 원소의 초기설정값 지정
      - size: 행, 열의 개수를 따로 지정해주는 것이 아니라 Size(cols, rows)의 형태로 지정해줄 수 있음.

 

How to release array data

  • Mat::~Mat() [calls Mat::release()] → 그러나 main 마지막에서 자동적으로 call이 되기 때문에 굳이 코딩해줄 필요 X

 

Type

  • CV_8U: 8-bit unsigned integer: uchar (0~255) → 이미지 픽셀값이 0 ~ 255라는 점을 보았을 때 이미지를 표현할 수 있는 최소한의 배열 타입이라고 짐작할 수 있을 듯
  • CV_8S: 8-bit signed integer: schar (-128~127)
  • CV_16U : 16-bit unsigned integer: ushort (0~65535)
  • CV_16S: 16-bit signed integer: short (-32768~32767)
  • CV_32S: 32-bit signed integer: int (-2147483648~2147483647)
  • CV_32F: 32-bit floating-point number: float (-FLT_MAX~FLT_MAX, INF, NAN)
  • CV_64F: 64-bit floating-point number: double (-DBL_MAX~DBL_MAX, INF, NAN)

 또한 원소 데이터 타입 이후에 채널 개수를 표현할 수 있다. ex) CV_8UC1 등 → 이때는 채널 개수 고정
 혹은 CV_8UC(n) or CV_MAKETYPE(CV_8U, n) 매크로로 채널 개수를 지정해줄 수 있다. 

 

Example

  • Mat M(7,7,CV_32FC2, Scalar(1,3))
    : 7X7의 허수 행렬. 이때 행렬 원소의 디폴트값은 1+3i 이다. 또한 채널 2개인 32비트 float으로 원소 구성이 되어 있다.
  • M.create(100, 60, CV_8UC3)
    : 100X60의 3채널로 구성된 8비트 unsigned integer 행렬. Mat M에 담겨 있던 이전 데이터는 모두 deallocate됨.

 

 

 

300x250

'Computer Science > computer vision' 카테고리의 다른 글

Challenges in Visual Recognition  (0) 2021.03.28