Mat 클래스 기초 사용법

BERT·2023년 4월 18일
0

Computer Vision

목록 보기
10/56
post-custom-banner

선언

640x480 uchar 1채널

픽셀값 128

Mat img2(480, 640, CV_8UC1);
Mat img5(480, 640, CV_8UC1, Scalar(128));

640x480 uchar 3채널

픽셀값 Red

Mat img3(480, 640, CV_8UC3);
Mat img4(Size(640, 480), CV_8UC3);
Mat img6(480, 640, CV_8UC3, Scalar(0, 0, 255));

3x3 int zeros 행렬

Mat mat1 = Mat::zeros(3, 3, CV_32SC1);

3x3 int ones 행렬

Mat mat1 = Mat::ones(3, 3, CV_32SC1);

3x3 int eyes 행렬

Mat mat1 = Mat::eye(3, 3, CV_32SC1);

2x3 flaot {1,2,3,4,5,6} 행렬

data 주소 참조

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

2x3 uchar {1,2,3,4,5,6} 행렬

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

재정의

256x256 uchar 3채널

픽셀값 Blue

mat4.create(256, 256, CV_8UC3);
mat4 = Scalar(255, 0, 0);

4x4 flaot ones 행렬

mat5.create(4, 4, CV_32FC1);
mat5.setTo(1.f);

복사

참조 복사

img1을 img2에 참조 복사
하나의 주소를 2개의 변수가 가리킴

Mat img2 = img1;

깊은 복사

새로운 메모리 할당 후 복사
img1을 img4에 깊은 복사
img1을 img5에 깊은 복사

Mat img4 = img1.clone();
img1.copyTo(img5);

참조 크롭

img1의 사각형 부분 img2에 참조 크롭

Mat img2 = img1(Rect(220, 120, 340, 240));

깊은 크롭

img1의 사각형 부분 img3에 깊은 크롭

Mat img3 = img1(Rect(220, 120, 340, 240)).clone();

영상 픽셀 값 참조

Mat::at()

template<typename _Tp> _Tp& Mat::at(int y, int x)

y : 참조할 행
x : 참조할 열

zeros 행렬 선언 후 모든 픽셀에 1 더하기

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)++;
    }
}

Mat::ptr()

template<typename _Tp> _Tp* Mat::ptr(int y)

y : 참조할 행
return : y번 행 시작 주소

모든 픽셀에 1 더하기

for (int y = 0; y < mat1.rows; y++) {
	uchar* p = mat1.ptr<uchar>(y);
    
	for (int x = 0; x < mat1.cols; x++) {
    	p[x]++;
    }
}

MatIterator <T>

영상의 크기를 모르더라도 사용가능
성능은 느린 편

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

기초 행렬 연산

2x2 float {1, 1, 2, 3} 행렬 mat1
역행렬 mat2
mat1의 전치행렬

float data[] = {1, 1, 2, 3};
Mat mat1(2, 2, CV_32FC1, data);

Mat mat2 = mat1.inv();

mat1.t()
post-custom-banner

0개의 댓글