Computer Vision 44

[OpenCV] Vec 클래스

Vec 클래스란 Vec 클래스란? 작은 개수의 원소로 구성된 벡터를 표현하는 템플릿 클래스이다. Vec 클래스는 OpenCV 프로그래밍에서 유용하게 사용되고 있다. Vec 클래스는 Matx 클래스의 상속을 받는다. ​ 하나의 행으로만 이루어진 행렬을 행 벡터라고 부르고, 하나의 열로만 구성된 행렬은 열 벡터라고 부른다. 즉, 벡터는 같은 자료형을 가진 원소 몇 개로 구성된 데이터 형식이라고 볼 수 있다. template class Matx { public: ... _Tp val[m*n]; } template class Vec : public Matx { public: ... _Tp& operator[](int i); }; tmplate static inline std::ostream& operator 괄..

[OpenCV] Mat 클래스의 크기 및 타입 변환 함수

Mat 클래스의 크기나 타입을 변환시키는 멤버 함수가 있다. ​ Mat::convertTo() void Mat::convertTo(OutputArray m, int rtype, doule alpha=1, double beta=0) const; m : 출력 행렬이다. 만약 m 행렬이 적절한 크기와 타입이 아닌 경우 행렬 원소 데이터를 새로 할당한다. rtype : 원하는 출력 행렬의 타입이다. 만약 rtype이 음수이면 출력 행렬은 입력 행렬과 같은 타입을 갖는다. alpha : 추가적으로 곱할 값 beta : 추가적으로 더할 값 Mat::convertTo() 함수는 행렬의 타입을 변경하는 함수이다. 행렬 원소의 타입을 다른 타입으로 변경하고, 추가적으로 모든 원소에 일정한 값을 더하거나 곱할 수 있다. ..

[OpenCV] Mat 클래스의 픽셀 접근 방법

OpenCV 에서 제공하는 픽셀(원소) 접근 방법은 여러 가지가 있다. ​ Mat::at(); template _Tp& Mat::at(int y, int x) y : 참조할 행 번호 x : 참조할 열 번호 반환값 : (_Tp& 타입으로 형 변환된) y번째 행, x번째 열의 원소 값(참조) Mat::at() 함수는 보통 행과 열을 나타내는 2개의 정수를 인자로 받아 해당 위치의 픽셀 값을 참조 형식으로 반환한다. 템플릿을 사용하는 템플릿 함수로서 여러 가지 형태로 재정의가 되어 있다. 템플릿 함수로 지정되어 있기 때문에 사용할 때 자료형을 명시적으로 지정해야 한다. 예를 들어 Mat 행렬의 타입이 CV_8UC1이면 uchar 자료형을, CV_32FC1 타입이라면 float 자료형을 지정한다. ​ 만약 CV..

[OpenCV] Mat 클래스 ROI 추출 함수

ROI(Region Of Interset)란 ROI란 이미지(영상) 에서 내가 원하는 관심 영역을 말한다. ​ Mat 클래스로 정의된 행렬에서 특정 사각형 영역의 부분 행렬을 추출하고 싶을 땐 괄호 연산자 재정의를 사용한다. ​ ​ Mat::Mat(); Mat Mat::operator()(const Rect& roi) const; Mat Mat::operator()(Range rowRange, Range colRange) const; roi : 사각형 관심 영역 rowRange : 관심 행 범위 colRange : 관심 열 범위 반환값 : 추출한 부분 행렬 또는 영상이다. 부분 영사의 픽셀 데이터를 서로 공유한다. 부분 영상 추출 코드 작성 Mat img1 = imread("Lenna.bmp"); // ..

[OpenCV] Mat 클래스의 행렬 복사

Mat 클래스 객체에 저장된 영상 또는 행렬을 복사하는 가장 간단한 방법은 복사 생성자 또는 대입 연산자를 사용하는 것이다. Mat img1 = imread("Lenna.bmp"); Lenna.bmp 파일을 불러와 Mat 타입의 변수 img1에 저장한다. Mat img2 = img1; // 복사 생성자(얕은 복사) img1 변수에 저장된 레나 영상을 복사하여 img2에 저장한다. img1과 같은 크기, 같은 타입의 새로운 Mat 객체 img2를 생성하고, img1의 픽셀 데이터를 img2가 참조하도록 설정한다 즉, img1과 img2는 하나의 영상을 공유하는 서로 다른 이름의 변수 형태로 동작한다. 이처럼 Mat 클래스의 복사 생성자는 행렬의 원소 데이터를 공유하는 얕은 복사(Shallow Copy)를 ..

[OpenCV] Mat 객체 생성과 초기화 함수

Mat 클래스를 이용하여 객체의 생성과 초기화 방법은 여러가지 방법이 있다. ​ Mat 클래스의 객체 생성 방법 Mat(); 기본 생성자 Mat img1; 가장 기본적인 Mat 객체 생성 방법으로 Mat 클래스의 기본 생성자를 이용하는 방법이다. 기본 생성자는 아무런 인자를 받지 않으며, 실제 코드 작성 시에는 단순히 Mat 클래스 타입의 변수를 선언하는 형태이다. img1 객체는 비어 있는 행렬이다. 즉 img1.rows 와 img1.cols 의 값은 0이고 img1.data에도 0(NULL)이 저장된다. 이렇게 비어 있는 행렬을 OpenCV 영상 처리 함수의 입력으로 사용하거나 비어 있는 행렬의 원소 값을 참조 시 에러가 발생한다. Mat::Mat(); 객체 생성과 동시에 원소 값 저장을 위한 메모리..

[OpenCV] Mat 클래스의 자료형

OpenCV에서 Mat 클래스의 여러 자료형의 원소를 가질 수 있으며, 원소는 하나의 값을 가질 수도 있고, 또는 여러 개의 값이 모여서 하나의 원소로 표현되기도 한다. ​ OpenCV에서 C/C++ 기본 자료형 중 unsigend char, signed char, unsigned short, signed short, int, float, double 자료형을 사용하는 Mat 행렬을 지원한다. OpenCV 4.0 버전 부터는 16비트 실수형 자료형도 존재한다. Mat 클래스에서 어떤 행렬이 어떤 자료형을 사용하는지에 대한 정보를 깊이(depth)라고 한다. ​ OpenCV는 C/C++에서 사용하는 기본 자료형의 이름을 typedef 구문을 이용하여 재정의 해서 사용한다. OpenCV에서 사용하는 주요 자..

[OpenCV] Mat 클래스

OpenCV에서 가장 많이 사용하는 클래스는 행렬을 나타내는 Mat 클래스이다. 그러므로 OpenCV 라이브러리를 잘 다루기 위해서는 Mat 클래스를 제대로 이해해야 한다. ​ Mat 클래스의 개요 Mat 클래스란? OpenCV 라이브러리에서 가장 많이 사용하는 행렬을 표현하는 클래스이다. 이름에서 알 수 있듯이 행렬(Matrix)을 표현하는 클래스이다. OpenCV가 컴퓨터 비전 라이브러리이기 때문에 실제로는 일반적인 행렬보다는 2차원 영상을 표현하는 용도로 많이 사용된다. ​ 일반적인 2차원 행렬뿐만 아니라 고차원 행렬을 표현할 수 있으며, 한 개 이상의 채널을 가질 수 있다. 정수, 실수, 복소수 등으로 구성된 헹렬 또는 벡터(vector)를 저장할 수 있고, 그레이스케일 또는 컬러 영상을 저장할 ..

[OpenCV] String 클래스

많은 프로그램에서 그렇듯 OpenCV에서도 문자열을 다루는 경우가 많다. OpenCV 에서는 영상 출력 창에 고유의 문자열을 지정하여 구분하고, 영상에 문자열을 출력하는 기능을 제공한다. C++ 표준 라이브러리(STL) 에서 std::string 클래스와 같이 OpenCV 에서는 cv::String 클래스를 사용하여 문자열을 저장하고 차리할 수 있다. ​ OpenCV 4.0 버전 이전에 자체적인 String 클래스를 정의하여 사용하였다. 그러닥 OpenCV 4.0 버전부터 자체적인 String 클래스 정의를 삭제하고 대신 C++ 표준 라이브러리의 std::string 클래스를 String 클래스로 이름 재정의하여 사용한다. 실제로 OpenCV 헤더 파일에는 다음과 같이 typedef로 재정의 코드가 들어..

[OpenCV] Range 클래스

Range 클래스란 범위 또는 구간을 표현하는 클래스이다. Range 클래스는 start 와 end를 멤버 변수로 갖는다. start : 범위의 시작 end : 범위의 끝 class Range { public: Range(); // 기본 생성자로 start와 end를 0으로 초기화 Range(int _start, int _end); // 두 개의 정수를 인자로 받는 생성자로 start = _start, end = _end로 초기화 int size() const; // Range::size() 멤버 함수는 범위 크기(end - start) 반환 bool empty() const; // Range::empty() 멤버 함수는 start와 end가 같으면 true 반환 static Range all(); //..