본문 바로가기
C++/OpenCV

OpenCV의 기본 자료 구조

by usang0810 2019. 4. 10.

OpenCV에서는 사각형, 좌표, 크기, 색상 등을 나타내는 다양한 자료구조들을 템플릿클래스로 제공한다.

Point_, Size_, Rect_, Vec, Scalar_클래스를 다룬다.

 

Point_클래스

 

가로와 세로의 위치를 2차원 좌표로 나타내기 위한 템플릿 클래스이다.

int, float, double 다양한 데이터 타입을 사용할 수 있고 생성자의 매개변수로 x와 y의 좌표값을 넣을 수 있다.

Point_<int> pi;

Point_<float> pf;

Point_<double> pd;

위와같이 데이터타입을 같이 선언하는데 더 간결하게도 표현할 수 있다.

Point2i pi;

Point2f pf;

Point2d pd;

위와같이 표현할 수 있다.
Point_클래스에서는 3차원 자료도 나타낼수 있다.

#include <opencv2\opencv.hpp>

#include <stdlib.h>

 

using namespace cv;

using namespace std;

 

int main() {

 

    Point3i pt1(10, 10, 10);

    Point3i pt2(20, 20, 20);

 

    cout << "두 벡터의 내적 = " << pt1.dot(pt2) << endl;

    cout << "두 벡터의 합 = " << pt1 + pt2 << endl;

    cout << "스칼라 곱 = " << pt1 * 10 << " " << pt2 * 10 << endl;

 

    return 0;

    

}

Colored by Color Scripter

 

 

 

 

벡터의 내적과 벡터의 합 각 벡터에 스칼라 곱을 한 값을 구해봤다.

 

 

Size_클래스

 

Size_는 이미지나 사각형의 크기를 규정하는 템플릿 클래스이다.

생성자의 매개변수값으로는 순서대로 width, height의 값을 줄 수 있다.

Point_클래스와 내부 멤버 변수의 구조가 동일하기 때문에 서로 형변환이 가능하다.

따라서 객체간의 산술 연산이 가능하다.

area()함수를 이용하여 간단하게 넓이를 구할 수도 있다.

#include <opencv2\opencv.hpp>

#include <stdlib.h>

 

using namespace cv;

using namespace std;

 

int main() {

 

    Point2i pt1(1010);

 

    Size sz1(1020);

    Size sz2(5030);

 

    cout << "sz1의 넓이 = " << sz1.area() << endl;

    cout << "sz1 + sz2 = " << sz1 + sz2 << endl;

    cout << "sz1 + pt1 = " << sz1 + (Size)pt1 << endl;

 

    return 0;

    

}

Colored by Color Scripter

 

 

 

 

 

위와같이 Size_클래스와 Point_클래스가 호환되는 것을 알 수 있다.

sz1 + pt1의 연산을 수행할때 pt1의 형변환을 (Size2d)로 했을 때 오류가 생긴걸로 보아 정확한 Size_의 데이터타입에 맞는 형변환을 해줘야 연산이 오류없이 이루어진다.

 

 

Rect_클래스

 

Rect_클래스는 2차원의 사각형 정보를 나타내기 위한 템플릿 클래스이다.

생성자의 매개변수로는 (x좌표, y좌표, width, height)의 값을 순서대로 넣는다.

사각형의 가로와 세로는 x, y의 좌표로부터 오른쪽과 밑쪽으로 그려진다.

Rect_클래스의 내부 메소드는 tl(), br() -> top left, bottom right의 좌표를 반환하는 메소드이고

size(), area()는 사각형의 크기와 넓이를 반환하는 메소드이다.

Rect_객체는 Point_객체 및 Size_객체와 산술 연산이 가능하다.

  1. rect = rect + point 일 경우 사각형을 평행이동 시킨다.
  2. rect = rect + size 일 경우 사각형의 크기를 변경한다.
  3. rect = rect & rect2 일 경우 두 사각형의 교차영역을 저장한다.
  4. rect = rect | rect2 일 경우 두 사각형을 모두 포함시키는 최소크기의 사각형을 저장한다.

#include <opencv2\opencv.hpp>

#include <stdlib.h>

 

using namespace cv;

using namespace std;

 

int main() {

 

    Point2i pt1(1010);

    Point2i pt2(2050);

 

    Size sz1(1020);

    Size sz2(5030);

 

    Rect rect1(551010);

    Rect rect2(pt1, pt2);

    Rect rect3(pt1, sz1);

    Rect rect4(sz1, sz2);

    Rect rect5 = rect3 & rect4;

    Rect rect6 = rect3 | rect4;

 

    cout << "rect1의 size, area = " << rect1.size() << ", " <<  rect1.area() << endl;

    cout << "rect2의 tl, br = " << rect2.tl() << ", " << rect2.br() << endl;

    cout << "rect3 & rect4 = " << rect5 << endl;

    cout << "rect3 | rect4 = " << rect6 << endl;

 

    return 0;

    

}

Colored by Color Scripter

 

 

 

 

 

 

Rect_클래스의 객체를 만들때 Point_객체와 Size_객체와의 호환성이 좋은 것을 알수 있다.

 

 

Vec 클래스 

 

Vec클래스는 원소 개수가 작은 숫자 벡터를 위한 템플릿 클래스이다.

이 클래스의 특징으로는 데이터의 자료형뿐만 아니라 원소의 개수도 인자로 받는다.

ex) Vec<int, 2>, Vec<double, 3>, Vec2b, Vec6f 등등

특히 Vec<type, 2>, Vec<type, 3>, Vec<type, 4>는 각각 Point_, Point3_, Scalar_ 클래스로 형변환이 가능하다.

내부 메소드로 mul()이 있고 벡터의 원소 간 곱을 반환한다.

#include <opencv2\opencv.hpp>

#include <stdlib.h>

 

using namespace cv;

using namespace std;

 

int main() {

 

    Vec<int2> vec1(1020);

    Vec<float3> vec2(11.5f, 21.6f, 16.7f);

    Vec2i vec3(2020);

    Vec3f vec4(10.5f, 12.3f, 33.5f);

 

    Point2i pt1 = vec1 + vec3;

    Point3f pt2 = vec2 + vec4;

 

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

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

    cout << "vec1.mul(vec3) = " << vec1.mul(vec3) << endl;

    cout << "vec2.mul(vec4) = " << vec2.mul(vec4) << endl;

 

    return 0;

    

}

Colored by Color Scripter

 

 

 

 

 

 

 

 

Scalar_ 클래스

 

Scalar_클래스는 Vec 클래스 중에서 Vec<type, 4>에서 파생된 템플릿 클래스로 4개의 원소를 갖는다.

OpenCV에서 특별히 화소의 값을 지정하기 위한 자료형으로 (Blue, Green, Red, 투명도) 4개의 값을 저장한다.

초기화할 때 값을 지정하지않으면 0으로 설정된다.

#include <opencv2\opencv.hpp>

#include <stdlib.h>

 

using namespace cv;

using namespace std;

 

int main() {

 

    Scalar_<uchar> red(00255);

    Scalar_<int> green(02550);

    Scalar_<double> blue(25500);

    Scalar_<int> color(250);

    Scalar_<double> rnb = (Scalar_<double>)red + blue;

 

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

    cout << "green = " << green[0]<< ", " << green[1<< ", " << green[2<< endl;

    cout << "red + blue = " << rnb << endl;

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

 

    return 0;

    

}

Colored by Color Scripter

 

 

 

 

 

 

초기값을 따로 지정하지 않았을때 0으로 저장되는 것을 알 수 있다. 

 

 

'C++ > OpenCV' 카테고리의 다른 글

[OpenCV]vector 클래스  (0) 2019.04.11
[OpenCV]Mat_ 클래스와 Matx 클래스  (0) 2019.04.10
[OpenCV]Mat 클래스  (0) 2019.04.10
[OpenCV]RotatedRect 클래스  (0) 2019.04.10
두개의 회전사각형을 포함하는 bounding 사각형  (0) 2019.03.15