[python]OpenCV 공부노트 Mat

글쓴이 Engineer Myoa 날짜

 

앞서 Matx와 Size, Range 등의 기본적인 클래스를 사용해보고 Mat클래스부터 TIL을 남기고자 한다.

 

 

 

#pragma warning(disable: 4819)
#include "opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
	Mat A(2, 3, CV_8UC1);
	Mat B(2, 3, CV_8UC1, Scalar(0));
	Mat C(2, 3, CV_8UC3, Scalar(1, 2, 3,4)); // 채널이 3이기때문에(C3) Scalar(,4)는 포함되지 않음.
	Mat E(2, 3, CV_8UC4, Scalar(1, 2, 3, 4));	// (1,2,3,4),(1,2,3,4),(1,2,3,4),
												// (1,2,3,4),(1,2,3,4),(1,2,3,4)	의 2,3가 나옴

	float data[] = { 1,2,3,4,5,6 };

	Mat D(2, 3, CV_32FC1, data);

	cout << A << endl << endl;
	cout << B << endl << endl;
	cout << C << endl << endl;
	cout << D << endl << endl;
	cout << E << endl << endl;
	//cout << F << endl << endl;

	// Mat 생성자 이용시
	// Size를 이용해서 (col, row)를 파라미터로 주는방법과
	// row, col을 하드로 작성하는 방법. 결과는 같다.

	Mat A1(Size(3, 2), CV_8UC1);
	Mat B1(Size(3, 2), CV_8UC1, Scalar(0));
	Mat C1(Size(3, 2), CV_8UC3, Scalar(1,2,3));
	Mat D1(Size(3, 2), CV_8UC3, data);

	cout << A1 << endl << endl;
	cout << B1 << endl << endl;
	cout << C1 << endl << endl;
	cout << D1 << endl << endl;


	return 0;
}

 


 

#pragma warning(disable: 4819)
#include "opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
	Vec<float, 3> V(1, 0, 0);
	Mat V1(V);
	Mat V2(Vec<float, 3>(0, 1, 0));

	cout << V1 << endl << endl;
	cout << V2 << endl << endl;


	cout << endl << "=======================" << endl << endl;

	Matx<float, 3, 3> A(1, 2, 3, 4, 5, 6, 7, 8, 9);
	Mat A1(A); // Matx를 이용해 Mat 생성자로 초기화
	Mat A2(A1, Range(1, 2), Range::all()); // [1,2)행, 모든칼럼 -> (4,5,6)
	Mat A3(A1, Rect(1, 1, 2, 2)); // x,y, width, height -> (5,6), (8,9)

	CvMat mat = cvMat(3, 3, CV_32FC1, A.val);
	Mat A4 = cvarrToMat(&mat); // copyData = false
	Mat A5 = cvarrToMat(&mat, true); // copyData = true. (= deepCopy)

	A.val[0] = 200;

	cout << A1 << endl << endl;
	cout << A2 << endl << endl;
	cout << A3 << endl << endl;

	cout << endl << "==========deep copy test===========" << endl << endl;

	cout << A4 << endl << endl;
	cout << A5 << endl << endl;



	return 0;
}

 

 

V1과 V2는 3×1행렬이 생성되었음. ( 1*3 예상했었음 )

A4의 경우 A[0]이 200으로 바뀌자 A를 참고하고있었기 떄문에 A4[0]도 200이 된다.

A5는 deepcopy라 영향받지않음.

 

중요한건 Range(int r1, int r2),Range(int c1, int c2) 는 각 행, 열 범위를 의미하고 (ex. Range(0,1), Range(1,2) 면 0행, 1열 범위)

해당하는 범위가 [r1,r2), [c1,c2) 라는 것이다.

 


 

다음으로는 3차원 행렬을 다루어 본다.

#pragma warning(disable: 4819)
#include "opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
	int sizes[] = { 2,3,4 };
	Mat A(3, sizes, CV_32FC1);
	Mat B(3, sizes, CV_32FC1, Scalar(0));

	cout << "B.dims = " << B.dims << endl;
	cout << "B.rows = " << B.rows << endl;
	cout << "B.cols = " << B.cols << endl;

	cout << "B.size[0] = " << B.size[0] << endl;
	cout << "B.size[1] = " << B.size[1] << endl;
	cout << "B.size[2] = " << B.size[2] << endl;



	return 0;
}

 

dims가 >2 이기때문에 rows와 cols는 -1로 출력된다.

B 각 원소의 size가 2,3,4인 것으로 보아 2x3x4 공간의 Matrix인것을 알 수 있다.

 


 

#pragma warning(disable: 4819)
#include "opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
	int sizes[] = { 2,3,4 };
	Mat A(3, sizes, CV_32FC1);
	Mat B(3, sizes, CV_32FC1, Scalar(0));


	for (int i = 0; i < B.size[0]; i++) {
		cout << "B[" << i << "]" << endl;
		for (int j = 0; j < B.size[1]; j++) {
			for (int k = 0; k < B.size[2]; k++) {
				cout << B.at<float>(i, j, k); // 32FC1이므로 float템플릿을 이용하여 접근
				if (k != B.size[2] - 1) {
					cout << ", ";
				}
				else {
					cout << ";";
				}
			}
			cout << endl;
		}
	}


	return 0;
}

 

3×4의 배열이 2개가 존재하여 2x3x4 공간을 이룬다. (z*y*x)

 


 

 

#pragma warning(disable: 4819)
#include "opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
	Ptr<IplImage> oldImage(cvLoadImage("lena.jpg", IMREAD_GRAYSCALE));
	if (oldImage.empty()) {
		cout << "file not found." << endl;
		return -1;
	}

	Mat newImage = cvarrToMat(oldImage);

	imshow("newImage", newImage);
	waitKey();

	return 0;
}

IplImage와 cvLoadImage에 의해 행렬을 생성하는 방법.

 

 

Mat::create() 행렬 생성은 이어서..

카테고리: 개발노트

51개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다