관심쟁이 영호

[#8] OpenCV (With. c++)ㅣ RotatedRect 클래스, Matx클래스 본문

학교공부/OpenCV

[#8] OpenCV (With. c++)ㅣ RotatedRect 클래스, Matx클래스

관심쟁이 영호 2020. 11. 11. 01:30
반응형

RotatedRect, Matx

안녕하세요! 관심쟁이 영호입니다.

오늘 공부할 주제는!

OpenCV에 있는 RotatedRect클래스, Matx클래스입니다!

 

바로 보시죠!

 


1. RotatedRect Class

RotatedRect클래스는 이전에 보았던 Rect클래스와 비슷하다고 보시면 됩니다!

먼저 생성자와 인수구조를 보시죠!

 

RotatedRect();

RotatedRect(회전의 중심점, 사각형의 크기, 회전각도)

이렇게 이루어져 있네요!

 

조금만 생각해보면 최소로 필요한 것만 추가하면 되는거네요!!

 

그럼 코드를 살펴볼게요.

 

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

void main() {
	
	Mat image(300, 500, CV_8UC1, Scalar(255));

	Point2f center(250, 150), pts[4];
	Size size(300, 100);
	RotatedRect rot_rect(center, size, 20); //center포인트를 중심으로 size크기의 사각형을 20도 돌려라!
	
	Rect bound_rect = rot_rect.boundingRect(); //rot_rect를 포함하는 최소 사각형 초기화!

	rectangle(image, bound_rect, Scalar(0), 1); // 사각형 그리기!
	circle(image, rot_rect.center, 1, Scalar(0), 2); //rot_ret의 중심점에 원그리기

	rot_rect.points(pts); // rot_rect사각형의 꼭지점을 배열에 넣기!

	for (int i = 0; i < 4; i++)
	{
		circle(image, pts[i], 4, Scalar(0), 1); // 사각형의 꼭지점에 원그리기!
		line(image, pts[i], pts[(i + 1) % 4], Scalar(0), 2); // 사각형 꼭지점들 선긋기!
	}

	imshow("회전사각형", image);


	
	waitKey(0);
	

}

 

결과를 보실게요!

위와 같이 출력되는것을 볼 수 있어요!

 

코드를 보시면 이해안되는 함수도 있으실 겁니다.

살펴보시죠.

 

boundingRect()

회전사각형의 4개 모서리를 모두 포함하는 최소 크기의 사각형 영역을 반환!

 

Points()

인수로 입력되는 pts배열에! 회전 사각형의 4개 꼭짓점을 전달한다!

 

여기서 가장중요한게, 4개의 꼭짓점이 float형식이라서 pts배열을 float타입으로 설정해주어야 합니다.

 

 

2. Matx 클래스

이 클래스는 기존의 Mat클래스를 사용하기 쉽게 만든 것인데요!

 

보통 Mat을 사용하려면 선언하고 초기화할 때, {} 괄호안에 배열처럼 등록해주어야 하죠!

아니면 복사방식이나 다른 방식을 이용해요!

 

근데 매번 힘드니까

크기가 작은 행렬에 한해서 Matx클래스를 지원해주어요!

그럼 어떻게 선언하는지 살펴보시죠.

 

Matx<double, 3, 3> 이름(1, 2, 3, 4, 5, 6, 7, 8, 9)

괄호안에 있는 것은 인수들!

3x3이니까 총 아홉 개!

 

근데 이거마저도 편하게 선언하는 방법이 또 있어요! 보시죠.

Mat33d 이름2(1, 2, 3, 4, 5, 6, 7, 8, 9);

이렇게 존재한답니다 !!

 

앞으로 크기가 작은 행렬을 다루기가 엄청 쉽겠죠!

(개인적인 생각으로 그냥 Mat 사용하면 되는데.. 왜쓰나 모르겠네요 ㅋㅋㅋ 메모리 문제인가..?)

 

아마도 방금 같은 의문은 여기서 결정되는거 같아요!

 

Matx의 다양한 속성

항목 설명
멤버변수 dims 차원 수
rows 행의 개수
cols 열의 개수
data 행렬 원소 데이터에 대한 포인터
step 행렬의 한 행이 차지하는 바이트 수
channels() 행렬의 채널 수 반환
멤버 메서드 depth() 행렬의 깊이값 반환
elemSize() 행렬의 한 원소에 대한 바이트 크기 반환
elemSize1() 행렬의 한 원소의 한 채널에 대한 바이트 크기 반환
empty() 행렬 원소가 비어있는지 여부 반환
isSubmatrix() 참조 행렬인지 여부 반환
size() 행렬의 크기를 Size형으로 반환
step1() step을 elemSize1()으로 나누어서 정규화된 step반환
total() 행렬 원소의 전체 개수 반환
type() 행렬의 데이터 타입 반환

이렇다네요!

음.. Mat에도 있는거 아닌가?..ㅋㅋㅋ

잘 안쓸거같아요..ㅋㅋㅋ

 

 

오늘은 여기까지!

 


300x250
Comments