-
OpenCV 주요 클래스OpenCV/OpenCV_C++ 2023. 11. 27. 22:23
1. Point, Size, Rect Class
- Point Class
- 2차원 점의 좌표 표현을 위한 템플릿 클래스
- 멤버 변수: x, y
- 멤버 함수: dot(), ddot(), cross(), inside() 등
- 다양한 사칙 연산에 대해 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩 지원
#include <iostream> #include <sstream> #include "opencv2/opencv.hpp" int main() { cv::Point pt1, pt2(4, 3), pt3(2, 4); int a = 2; pt1 = pt2 + pt3; std::cout << pt1 << std::endl; // [6, 7] pt1 = pt2 - pt3; std::cout << pt1 << std::endl; // [2, -1] pt1 = pt3 * a; std::cout << pt1 << std::endl; // [4, 8] pt1 = a * pt3; std::cout << pt1 << std::endl; // [4, 8] pt1 = pt3 / a; std::cout << pt1 << std::endl; // [1, 2] pt1 += pt2; std::cout << pt1 << std::endl; // [5, 5] pt1 -= pt2; std::cout << pt1 << std::endl; // [1, 2] pt1 *= a; std::cout << pt1 << std::endl; // [2, 4] pt1 /= a; std::cout << pt1 << std::endl; // [1, 2] double v = norm(pt2); std::cout << v << std::endl; // v = 5.0 bool b1 = pt1 == pt2; bool b2 = pt1 != pt2; std::cout << b1 << " " << b2 << std::endl; // false true or 0 1 return 0; }
- Size Class
- 영상 또는 사각형 크기 표현을 위한 템플릿 클래스
- 멤버 변수: width, height
- 멤버 함수: area()
- 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원
- Rect Class
- 2차원 사각형 표현을 위한 템플릿 클래스
- 멤버 변수: x, y, width, height
- 멤버 함수: tl(), br(), size(), area(), contains()
- 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원
cv::Rect rc1; // [0 by 0 from (0, 0)] cv::Rect rc2(10, 10, 60, 40); // [60 by 40 from (10, 10)] cv::Rect rc3 = rc1 + cv::Size(50, 40); // [50 by 40 from (0, 0)] cv::Rect rc4 = rc2 + cv::Point(10, 10); // [60 by 40 from (20, 20)] cv::Rect rc5 = rc3 & rc4; // AND연산 [30 by 20 from (20, 20)] cv::Rect rc6 = rc3 | rc4; // OR연산 [80 by 60 from(0, 0)]
2. Range, String Class
- Range Class
- 정수 값의 범위를 나타내기 위한 클래스
- 멤버 변수: start, end
- 멤버 함수: size(), empty(), all()
- start는 범위에 포함되고, end는 범위에 포함되지 않음. [start, end)
- String Class
- OpenCV에서 자체적으로 정의하여 사용하던 문자열 클래스.
- 하지만, OpenCV 4.x버전부터 std::string 클래스로 대체됨.
typedef std::string cv::String;
- cv::format() 함수를 이용하여 형식 있는 문자열 생성 가능 → C언어의 printf() 함수와 인자 전달 방식 유사.
cv::String str1 = "Hello"; cv::String str2 = std::string("world"); cv::String str3 = str1 + " " + str2; cv::Mat imgs[3]; for(int i = 0; i < 3; ++i){ cv::String filename = cv::format("test%02d.bmp", i + 1); imgs[i] = cv::imread(filename); }
3. Vec, Scalar Class
- Vec Class
- 벡터(vector)는 같은 자료형 원소 여러 개로 구성된 데이터 형식 (e.g. 열벡터)
- Vec 클래스는 벡터를 표현하는 템플릿 클래스
- std::cout 출력을 위한 << 연산자 오버로딩을 지원
Vec 클래스 이름 재정의
- 자주 사용되는 자료형과 개수에 대한 Vec 클래스 템플릿의 이름 재정의
- 형식: Vec<num of data>{b|s|w|i|f|d}
b: unsigned char, s: short, w: unsigned short
i: int, f: float, d: double
ex)
cv::Vec<uchar, 2> Vec2b; cv::Vec<short, 2> Vec2s; cv::Vec<ushort, 3> Vec3w cv::Vec<int, 4> Vec4i; cv::Vec<float, 2> Vec2f; cv::Vec<double, 2> Vec5d; - Scalar Class
- 크기가 4인 double 배열(double val[4])을 멤버 변수로 가지고 있는 클래스.
- 4채널 이하의 영상에서 픽셀 값을 표현하는 용도로 자주 사용.
- [] 연산자를 통해 원소에 접근 가능.
cv::Scalar gray = 128; std::cout << "gray: " << gray << std::endl; cv::Scalar yellow(0, 255, 255); std::cout << "yellow: " << yellow << std::endl; for (int i = 0; i < 4; i++) { std::cout << yellow.val[i] << ", " << yellow[i] << std::endl; }
결과
4. 행렬과 Mat Class
- 행렬(Matrix)?
- 수나 기호, 수식 등을 대괄호 안에 배열한 것.
행렬은 덧셈, 곱셈등의 기본 연산이 있고 역행렬과 전치행렬이 있다.
- Mat Class
- n차원 1채널 또는 다채널 행렬 표현을 위한 클래스
- 실수, 복소수 행렬.
- 그레이스케일 또는 트루컬러 영상.
- 벡터 필드, 히스토그램, 텐서(tensor) 등을 표현
- 다양한 형태의 행렬 생성, 복사, 행렬 연산 기능을 제공
- 행렬 생성시 행렬의 크기, 자료형, 채널 수(type), 초기값 등을 지정할 수 있다.
- 복사 생성자 & 대입 연산자는 얕은 복사를 수행한다.(참조 계수로 관리)
- 깊은 복사는 cv::Mat::copyTo() or cv::Mat::clone() 함수를 사용한다.
- 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원
cv::Mat img; cv::Mat dst1, dst2; img.copyTo(dst1); dst2 = img.clone();
- 행렬의 원소(픽셀 값) 접근 방법을 제공
- cv::Mat::data 멤버 변수가 실제 픽셀 데이터 위치를 가리킴.
- cv::Mat::at<typename>(int y, intx) 또는 cv::Mat::ptr<typename>(int y) 함수 사용을 권장한다.
- Mat Class의 깊이(depth)
- 행렬 원소가 사용하는 자료형 정보를 가리키는 매크로 상수
- cv::Mat::depth() 함수를 사용하여 참조
- 형식: cv_<bit_depth>{U|S|F}
#define CV_8U // uchar, unsigned char #define CV_8S // schar, signed char #define CV_16U // ushort, unsigned short #define CV_16S // short #define CV_32S // int #define CV_32F // float #define CV_64F // double #define CV_16F // float16_t
- Mat Class의 채널(channel)
- 원소 하나가 몇 개의 값으로 구성되어 있는가?
- cv::Mat::channels() 함수를 이용하여 참조.
- Grayscale 영상은 픽셀 하나당 밝기 값 1개.
- True color 영상은 픽셀 하나당 밝기 값 3개 (B, G, R)
- Mat Class의 타입(type)
- 행렬의 깊이와 채널 수를 한꺼번에 나타내는 매크로 상수.
- cv::Mat::type()함수를 이용하여 참조.
- 형식: CV_8UC1
- 8: 비트수(8/16/32/64), U: 정수형의 부호(S/U) 또는 실수형(F), 1: 채널 수
std::cout << "Width: " << img.cols << std::endl; std::cout << "Height: " << img.rows << std::endl; std::cout << "IMG_Channels: " << img.channels() << std::endl; std::cout << "DST_Channels: " << dst1.channels() << std::endl; std::cout << img.type() << std::endl; std::cout << dst1.type() << std::endl;
5. InputArray, OutputArray Class
- InputArray Class
- 주로 Mat 클래스를 대체하는 프록시 클래스(proxy class)로 OpenCV 함수에서 입력 인자로 사용됨.
- 사용자가 명시적으로 _InputArray 클래스의 인스턴스 또는 변수를 생성하여 사용하는 것을 금지.
- OutputArray Class
- OpenCV 함수에서 출력 인자로 사용되는 프록시 클래스
- _OutputArray 클래스는 _InputArray 클래스를 상속받아 만들어졌으며, 새로운 행렬을 생성하는 create() 함수가 정의.
- InputOutputArray Class
- OpenCV 함수에서 입력이자 출력으로 사용되는 프록시 클래스
'OpenCV > OpenCV_C++' 카테고리의 다른 글
OpenCV 유용한 함수 (2) 2023.12.21 OpenCV Draw & Event (0) 2023.12.14 OpenCV VideoCapture class (0) 2023.12.13 OpenCV Mat class 기초 사용법 (0) 2023.12.12 OpenCV 기초 및 편하게 사용하기 (2) 2023.11.26