더북(TheBook)

다음은 lenna.bmp 파일을 그레이스케일 영상 img1로 불러온 후, uchar 자료형 대신 float 자료형을 사용하는 행렬 img1f를 생성하는 예제 코드입니다.

Mat img1 = imread("lenna.bmp", IMREAD_GRAYSCALE);
 
Mat img1f;
img1.convertTo(img1f, CV_32FC1);

다음으로 살펴볼 Mat 클래스 멤버 함수는 Mat::reshape() 함수입니다. Mat::reshape() 함수는 주어진 행렬의 크기 또는 채널 수를 변경합니다. Mat::reshape() 멤버 함수는 다양한 형식으로 재정의되어 있으며, 그중 널리 사용되는 형식은 다음과 같습니다.

Mat Mat::reshape(int cn, int rows=0) const;

cn

새로운 채널 수. 만약 이 값이 0이면 채널 수를 변경하지 않습니다.

rows

새로운 행의 수. 만약 이 값이 0이면 행의 개수를 변경하지 않습니다.

반환값

모양이 변경된 행렬을 반환합니다.

 

Mat::reshape() 함수는 행렬 원소 데이터를 복사하여 새로운 행렬을 만드는 것이 아니라 하나의 행렬 원소 데이터를 같이 참조하는 행렬을 반환합니다. 그러므로 Mat::reshape() 함수에 의해 반환된 행렬 원소 값을 변경하면 원본 행렬의 원소 값도 함께 바뀌게 됩니다.

다음은 Mat::reshape() 함수를 이용하여 3×4 크기의 행렬을 1×12 크기의 행렬로 변환하는 예제 코드입니다.

uchar data1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
Mat mat1(3, 4, CV_8UC1, data1);
Mat mat2 = mat1.reshape(0, 1);
 
cout << "mat1:\n" << mat1 << endl;
cout << "mat2:\n" << mat2 << endl;
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.