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; |
#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;
} |
벡터의 내적과 벡터의 합 각 벡터에 스칼라 곱을 한 값을 구해봤다.
Size_클래스
Size_는 이미지나 사각형의 크기를 규정하는 템플릿 클래스이다.
생성자의 매개변수값으로는 순서대로 width, height의 값을 줄 수 있다.
Point_클래스와 내부 멤버 변수의 구조가 동일하기 때문에 서로 형변환이 가능하다.
따라서 객체간의 산술 연산이 가능하다.
area()함수를 이용하여 간단하게 넓이를 구할 수도 있다.
#include <opencv2\opencv.hpp> #include <stdlib.h>
using namespace cv; using namespace std;
int main() {
Point2i pt1(10, 10);
Size sz1(10, 20); Size sz2(50, 30);
cout << "sz1의 넓이 = " << sz1.area() << endl; cout << "sz1 + sz2 = " << sz1 + sz2 << endl; cout << "sz1 + pt1 = " << sz1 + (Size)pt1 << endl;
return 0;
} |
위와같이 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_객체와 산술 연산이 가능하다.
- rect = rect + point 일 경우 사각형을 평행이동 시킨다.
- rect = rect + size 일 경우 사각형의 크기를 변경한다.
- rect = rect & rect2 일 경우 두 사각형의 교차영역을 저장한다.
- rect = rect | rect2 일 경우 두 사각형을 모두 포함시키는 최소크기의 사각형을 저장한다.
#include <opencv2\opencv.hpp> #include <stdlib.h>
using namespace cv; using namespace std;
int main() {
Point2i pt1(10, 10); Point2i pt2(20, 50);
Size sz1(10, 20); Size sz2(50, 30);
Rect rect1(5, 5, 10, 10); 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;
} |
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<int, 2> vec1(10, 20); Vec<float, 3> vec2(11.5f, 21.6f, 16.7f); Vec2i vec3(20, 20); 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;
} |
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(0, 0, 255); Scalar_<int> green(0, 255, 0); Scalar_<double> blue(255, 0, 0); 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;
} |
초기값을 따로 지정하지 않았을때 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 |