ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.