본문 바로가기

# 미사용/OpenCV

[OpenCV] 기본 클래스 활용


 기본 클래스 종류

OpenCV에서 기본적인 연산의 주체는 다음과 같다.

  • Vec

  • Point_

  • Point3_

  • Size_

  • Rect_

  • RotatedRect

  • Scalar_



 Vec 클래스 활용

Vec 클래스는 다음과 같이 활용될 수 있다.

  • 길이가 같은 Vec 끼리 더하기.

  • 자료형이 다른 Vec 으로 변환하기.

  • Vec의 각 요소에 일정 값으로 곱하거나 나누기.

//! 길이가 같은 Vec 끼리 더하기.
Vec3i a1 = {1, 2, 3};
Vec3i a2 = {3, 2, 1};
Vec3i a3 = a1 + a2; //! [4, 4, 4]

//! 다른 자료형 Vec 으로 변환하기.
Vec3f b1 = {1.1, 2.2, 3.3};
Vec3i b2 = (Vec3i)b1;   //! [1, 2, 3]

//! 일정 값으로 곱하거나 나누기.
Vec3i c1 = {4, 5, 6};
Vec3i c2 = c1 * 2;  //! [8, 10, 12]
Vec3i c3 = c1 / 2;  //! [2, 2, 3]




 Point_ 클래스 활용

Point_ 클래스는 다음과 같이 활용될 수 있다.

  • 외적과 내적 구하기.

  • 주어진 사각형에 안에 있는지 검사하기.

  • 객체간 덧셈 뺄셈. 

  • 스칼라 곱셈 나눗셈.

  • 자료형이 다른 Point_로 변환하기.

//! 외적과 내적 구하기.
Point2f a1 = {3, 4};
Point2f a2 = {5, 6};
float inner_product = a1.dot(a2);   //! (39.0) 내적의 반환형은 _Tp
double outer_product = a1.cross(a2);//! (-2.0) 외적의 반환형은 double

//! 어떤 사각형 안에 있는지 검사하기.
Point2i b1 = {3, 4};
cout << b1.inside(Rect(0, 0, 3, 4)) << '\n'; //! false
cout << b1.inside(Rect(0, 0, 9, 9)) << '\n'; //! true

//! 객체간 덧셈 뺄셈.
Point c1 = {2, 3};
Point c2 = {3, 4};
Point c3 = c1 + c2; //! [5, 7]
Point c4 = c1 - c2; //! [-1, -1]

//! 스칼라 곱셈 나눗셈.
Point d1 = {3, 5};
Point d2 = d1 * 2;  //! [6, 10]
Point d3 = d1 / 2;  //! [1, 2]




 Point3_ 클래스 활용

Point3_ 클래스는 다음과 같이 활용될 수 있다.

  • 내적 구하기.

  • 주어진 사각형에 안에 있는지 검사하기.

  • 곱셈 나눗셈을 통해 확대/축소하기.

  • 자료형이 다른 Point3_로 변환하기.

Point3f a = {3, 4, 5};
Point3f b = {5, 6, 7};

//! 내적 구하기.
float inner_product = a.dot(b);   //! (74.0) 내적의 반환형은 _Tp.
double inner_product_2 = a.ddot(b);   //! (74.0) 내적의 반환형은 double.

//! 객체간 덧셈 뺄셈.
Point3f add = a + b;//! [8, 10, 12]
Point3f sub = a - b;//! [-2, -2, -2]

//! 스칼라 곱셈 나눗셈.
Point3f mul = a * 2.0;  //! [6, 8, 10]
Point3f div = a / 2.0;  //! [1.5, 2, 2.5]




 Size_ 클래스 활용

Size_ 클래스는 다음과 같이 활용될 수 있다.

  • 크기 구하기.

  • 객체간 덧셈 뺄셈.

  • 자료형이 다른 Size_로 변환하기.

Size2f a = {4, 1.5};
Size2f b = {2, 4.5};

//! 크기 구하기.
float size = a.area();  //! (6.0) 반환형은 _Tp.

//! 객체간 덧셈 뺄셈.
Size2f sum = a + b; //! [6 x 6]
Size2f sub = a - b; //! [2 x -3]




 Rect_ 클래스 활용

Rect_ 클래스는 다음과 같이 활용될 수 있다.

  • 왼쪽 위 좌표 구하기.

  • 오른쪽 아래 좌표 구하기.

  • Size 형태로 크기 객체 구하기.

  • _Tp 형태로 넓이 구하기.

  • 어떤 좌표가 사각형 안에 들어있는지 검사하기.

  • 평행 이동하기.

  • 크기 확장하기.

  • 두 Rect와 겹치는 최대 Rect 구하기.

  • 두 Rect를 포함하는 최소 Rect 구하기.

  • 자료형이 다른 Rect_로 변환하기.

Rect rect = {Point(0, 0), Size(5, 5)};

//! 왼쪽 위, 오른쪽 아래 좌표 구하기.
Point top_left  = rect.tl();//! [0, 0]
Point btm_right = rect.br();//! [5, 5]

//! 넓이 구하기.
Size size = rect.size();//! [5 x 5]
int area  = rect.area();//! 25

//! 어떤 좌표가 사각형 안에 들어있는지 검사하기.
rect.contains(Point(5, 5)); //! false.



Rect_ 간의 최대 공통 영역최소 포함 영역은,

다음 그림처럼 구해진다.

opencv rect 포함영역에 대한 이미지 검색결과





 RotatedRect 클래스 활용

Rect_ 클래스는 다음과 같이 활용될 수 있다.

  • 중심점 좌표 구하기.

  • 꼭지점 좌표 구하기.

  • 회전각 구하기.

  • 해당 회전 사각형을 포함하는 최소 Rect 구하기.

RotatedRect rr = {Point(5, 5), Size(4, 5), 20};

//! 중심점 좌표 구하기.
Point2f center = rr.center; //! [5, 5]

//! 회전각 구하기.
float angle = rr.angle; //! 20;

//! 꼭지점 좌표 구하기.
Point2f vertices[4];
rr.points(vertices);
/**
 * [2.26556, 6.66519]
 * [3.97567, 1.96673]
 * [7.73444, 3.33481]
 * [6.02433, 8.03327]
 */

//! 해당 회전 사각형을 포함하는 최소 Rect 구하기.
Rect bound = rr.boundingRect(); //! [7 x 9 from (2, 1)]


RoatedRect Bound

opencv rotated rect bound에 대한 이미지 검색결과