-
[The Core Functionality] Mat - The Basic Image ContainerComputer Vision 2020. 7. 25. 16:35
Mat 객체
- 더이상 수동으로 메모리를 할당하고, 필요하지 않은 즉시 해제 할 필요가 없다. 즉, 작업을 수행하는 데 필요한 만큼의 메모리만 사용한다.
- Mat은 기본적으로 두개의 데이터 파트를 가지는 한 클래스이다.
Matrix Header ( 매트릭스의 크기, 저장에 사용되는 방법, 주소가 저장된 매트릭스 등 )를 포함하는 매트릭스와
Pointer to the matrix contatining the Pixel Values (저장하기 위해 선택한 방법에 따라 모든 차원을 취함 )
- Open CV는 이미지 처리 라이브러리 이다. 많은 이미지 처리 기능이 포함되어있다. 계산 문제를 해결하기 위해 대부분 경우 라이브러리의 여러기능을 사용하게 된다.
- 각 Mat 객체에는 고유한 헤더가 있지만 Matrix Pointer 가 동일한 주소를 가리키도록 하여 두 인스턴스간에 매트릭스를 공유할 수 있다.
- 또한 복사 연산자는 헤더자체와 포인터 자테를 복사하는게 아닌 큰 행렬로 복사한다.
Mat A, C; //헤더 부분 A = imread(argv[1], CV_LOAD_IMAGE_COLOR); Mat B(A); //복사 생성자 C = A; //할당 연산자
위의 예제에선 모든 객체는 동일한 단일 데이터 매트릭스를 가리킨다.
하지만 헤더를 사용하여 수정하면 다른 헤더에도 영향을 미친다.
Ex) 이미지에서 관심 역역(ROI)를 만들려면 새로운 경계를 사용하여 새 헤더를 만든다.
Mad D ( A, Rect(10, 10, 100, 100) ); // using a rectangle Mat E = A(Range::all(), Range(1,3)); //using row and coulumn boundaries
매트릭스 자체를 복사하고 싶을때
Mat F = A.clone(); Mat G; A.cpyTo(G);
-> F또는 G를 수정해도 Mat 헤더가 가리키는 매트릭스에는 영향을 미치지 않는다.
저장 방법
픽셀 값을 저장하는 방법.
색 공간과 사용된 데이터 유형을 선택할 수 있다.
색상 공간은 주어진 색상을 코딩하기 위해 색상 구성 요소를 결합하는 방법을 나타낸다.
여러가지 색상 시스템
- Open CV 디스플레이 시스템은 BGR 색상을 사용한다.
- HSV 와 HLS는 색상을 채도, 채도 및 값/휘도 성분으로 분해하여 색상을 보다 자연스럽게 표현할 수 있다.
- YCrCb 는 널리 사용되는 JPEG 이미지 형식으로 사용된다.
- CIE L*a*b*는 지각적으로 균일 한 색공간으로, 주어진 색과 다른 색의 거리를 측정해야 할 때 편리하다.
Mat 객체를 명시적으로 만들기
Mat은 실제로 이미지 컨테이너로 잘 작동하지만 일반적으로 매트릭스 클래스 이기도하다.
따라서 다차원 행렬을 생성하고 조작할 수 있다.
Mat Object를 만드는데 다양한 방법이 있다.
Mat M(2, 2, CV_8UC3, Scalar(0,0,255));
세번째 인자,
CV_[The number of bits per item][SIgned or Unsigned][Type Prefix][C][The channel number]
-> "CV_8UC3" : we use unsigned char types that are 8 bit long and each pixel has three of these to form the three channels.
네번째 인자,
Scalar(B,G,R,A) : Four element short Vector
-> Specify this and you can initialize all matrix points with a custom value.
배열을 사용하고, 생성자를 통해 초기화 하는 방법
int sz[3] = {2, 2, 2}; Mat L(3, sz, CV_8UC(1), Scalar::all(0));
차원의 수를 지정한 다음 각 차원의 크기를 포함하는 포인터를 전달하면 나머지는 동일하게 유지.
이미 존재하는 포인터의 헤더를 변환하기.
IplImage *img = cvLoadImage("greatwave.png" , 1); Mat mtx (img); // Iplimage 변환 *-> Mat
Creat()함수
M.create(4, 4, CV_8UC(2) );
행렬의 값을 초기화 할 수 없다. 새로운 크기가이전 크기에 맞지 않을 경우에만 매트릭스 데이터 메모리를 재 할당한다.
MATLAB sytle로 초기화
Mat E = Mat::eye(4,4,CV_64F); Mat O = Mat::ones(2,2,CV_32F); Mat Z = Mat::zeros(3,3,CV_8UC1);
E = [ 1 0 0 0, 0 1 0 0, 0 0 1 0, 0 0 0 1]
O = [ 1 1, 1 1 ]
Z = [ 0 0 0, 0 0 0, 0 0 0]
기존 Mat 객체의 새 헤더를 만들고 clone()또는 copyTo ()한다.
Mat RowClone = C.row(1).clone();
Output formatting
- Default
cout<<"R (default) = " << R ;
R (default) = [ , , , ; , , , ; , , ,]
- Python
cout<<"R (python) = " << format(R, "python") ;
R (python) = [ [ [ , , ,] , [ , , ,] ], [ [ , , ,], [ , , ,] ] ]
- CSV
cout<<"R (csv) = " << format(R, "csv") ;
R (csv) = , , , , , , , , , ,
- Numpy
cout<<"R (numpy) = " << format(R, "numpy") ;
R (numpy) = array([ [ [ , , ,] , [ , , ,] ], [ [ , , ,], [ , , ,] ] ], type = 'uint8')
- C
cout<<"R (C) = " << format(R, "C") ;
R (C) = <, , , , , , , , , , , , , >
Ouput of other Common Items
- 2D Point
Point2f P(5,1);
-3D Point
Point3f P3F(2, 6, 7);
-std::vector via cv::Mat
vector<float> v; v.push_back( (float)CV_PI ); v.push_back( 2 ); v.push_back( 3.01f ); cout<<"Vector of floats via Mat = "<<Mat(v);
Vector of floats via Mat = [3.1415927; 2; 3.01]
-std::vector of points
vector<Point2f> vPoints(20); for(size_t i = 0; i<vPoints.size(); ++i) vPoints[i] = Pooint2f( (float)(i*5), (float)(i%7) ); cout<<" A vector of 2D pointers = "<<vPoints;
A vector of 2D Points = [ 0 , 0; 5 , 1; 10, 2; ... ]
Image 를 Matrix로 표현해 보기
#include <iostream> #include <opencv4/opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat img; img = imread("interlaken.jpg", 1); imshow("Interlaken", img); cout<<" Matrix of Image = \n"<<img<<endl; waitKey(); return 0; }
'Computer Vision' 카테고리의 다른 글
[The Core Functionality] Mask Operations on Matices (0) 2020.07.25 [The Core Functionality] How to scan Images, Lookup tables with Open CV (0) 2020.07.25 [Introduction to OpenCV] Load, Modify, and Save an Image (0) 2020.07.25 [ Introduction to OpenCV ] Load and Display an Image (0) 2020.07.25 X code 에서 Open CV 환경 만들기. (1) 2020.07.25