opencv 기초인 Mat 클래스와 imread, imshow에 대해 알아본다.

Mat

  • opencv에서 사용되는 이미지를 담는 클래스
  • 어마무시하게 많이 사용되는 클래스
  • opencv에서 컬러는 CV_8UC3 으로 나타내고, 흑백은 CV_8UC1로 나타낸다.
    • 8은 8비트 즉 0~255 값으로 색정보를 담는다.
    • UC는 unsigned char를 나타내고,
    • 3 혹은 1은 8비트짜리가 3개 혹은 1개 있다는 것을 의미한다.
    • color는 BGR 세가지 정보를 위해 8비트가 세개 있어야 하고, gray scale은 8비트가 하나만 있어도 표현이 가능하다.
  • 클래스를 생성하는 방법은 다양하며 아래 코드를 참고 한다.
Mat img1; 	// empty matrix

Mat img2(480, 640, CV_8UC1);		// unsigned char, 1-channel
Mat img3(480, 640, CV_8UC3);		// unsigned char, 3-channels
Mat img4(Size(640, 480), CV_8UC3);	// Size(width, height)

Mat img5(480, 640, CV_8UC1, Scalar(128));		// initial values, 128
Mat img6(480, 640, CV_8UC3, Scalar(0, 0, 255));	// initial values, red

Mat mat1 = Mat::zeros(3, 3, CV_32SC1);	// 0's matrix
Mat mat2 = Mat::ones(3, 3, CV_32FC1);	// 1's matrix
Mat mat3 = Mat::eye(3, 3, CV_32FC1);	// identity matrix

float data[] = {1, 2, 3, 4, 5, 6};
Mat mat4(2, 3, CV_32FC1, data);

Mat mat5 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
Mat mat6 = Mat_<uchar>({2, 3}, {1, 2, 3, 4, 5, 6});

mat4.create(256, 256, CV_8UC3);	// uchar, 3-channels
mat5.create(4, 4, CV_32FC1);	// float, 1-channel
  • Mat 클래스 복사는 아래를 참고 한다.
    • 클래스 변수는 직접 할당할 경우 같은 인스턴스를 참조하기 때문에 오류를 방지하기 위해 clone 메소드를 사용한다.
Mat img4 = img1.clone();
  • Mat 클래스는 이미지를 담다보니 이차원 배열과 유사한 연산이 가능하다.
    • 마치 배열 혹은 벡터 연산과 유사한 연산을 할 수 있다.
    • 자세한 내용은 아래 코드를 참고한다.
Mat mat1 = Mat::zeros(3, 4, CV_8UC1);

for (int y = 0; y < mat1.rows; y++) {
  for (int x = 0; x < mat1.cols; x++) {
    mat1.at<uchar>(y, x)++;
  }
}

for (int y = 0; y < mat1.rows; y++) {
  uchar* p = mat1.ptr<uchar>(y);

  for (int x = 0; x < mat1.cols; x++) {
    p[x]++;
  }
}

for (MatIterator_<uchar> it = mat1.begin<uchar>(); it != mat1.end<uchar>(); ++it) {
  (*it)++;
}

imread

  • 이미지를 읽어오는 API
  • 첫번째 인자로 파일 이름을 넣고, 두번째 인자로 컬러로 읽을 지 흑백으로 읽을지를 정하는 인자를 넣어준다.
  • 그레이 스케일로 읽어 올 때는 IMREAD_GRAYSCALE 를 넣어주고, 컬러로 읽을 때는 IMREAD_COLOR를 넣어준다.

imshow

  • 이미지를 화면에 뿌려주는 API
  • 이미지 정보를 뿌려줄 창 이름이 첫 번째 인자
  • 이미지 정보를 담은 변수가 두 번째 인자