OpenCV/OpenCV_C++

OpenCV 주요 클래스

Player_blue 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 함수에서 입력이자 출력으로 사용되는 프록시 클래스