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
- 이미지 정보를 뿌려줄 창 이름이 첫 번째 인자
- 이미지 정보를 담은 변수가 두 번째 인자