728x90
반응형


OpenCV를 공부하는데 앞서 제일 기본적인 OpenCV 기본 클래스에 대해서 간단히 정리해보기로 한다.

개발을 하다보면 제일 먼저 클래스가 어떤건지, 어떤식으로 돌아가는건지 기본적인 이해가 있어야 나중에 간단한 오류를 범하지 않게 된다. 


책은 가메출판사의 "C++API OpenCV 프로그래밍"을 쓰고 있고, 앞으로 이 폴더에 있는 대부분의 OpenCV 코드나, 내용은 이 책을 기반으로 한다. 내가 생각하기에 현재 나와있는 OpenCV 3.0 기반으로 제일 명확하고 자세하게 잘 나와있는 책이 아닌가싶다.




1. DataType, Point, Point3 클래스

1.1 기본 자료형 및 DataType 클래스


 OpenCV는 uchar, bool, char, unsigned short, signed short, int, float, double 또는 이들 자료형의 튜플로 구성된 기본 자료형을 갖게 된다. OpenCV 코드를 짜다보면 CV_8UC1, CV_32F, ... 이와같은 자료형을 접하게 되는데 다 외울 필요는 없고 이게 무슨 뜻인지 알면 될 것 같다.


CV_<깊이비트수>{U|S|F}C(<채널수>)     ,    (U: unsigned, S: signed, F: float)


 이러한 형식으로 구성이 되어있다. 예를들어 위에 써놓은 예제와 같이 CV_8UC1의 경우 깊이비트수는 8 비트 이고, unsigned형, 1채널로 구성되어있는 데이터 구조이다. 예제 하나를 더 따져보자면 CV_16UC4는 16비트, unsigned, 4채널로 구성되어있는 데이터 구조이다. 


 그렇다면 뭔가 부족해보이는 CV_8U, CV_64F 등은 채널 수가 생략된 형태이다. 이들은 1채널이다. C가 없는 것으로 보아 이런 자료형에서 항상 들어가는 C는 Channel의 줄임말인가보다. 이런 것을 배우다 보면 많은 자료형들을 외우는 것 보다 무엇인지 알 수 있으니 훨씬 이득(?)이다. 


여기까지 기본 자료형을 알아보았고 다음 DataType 클래스를 알아보자.


 DataType 클래스는 OpenCV 기본 자료형을 표현하기 위한 템플릿 클래스로 멤버 데이터나 메서드를 갖지 않는다. 기본 자료형을 표현하기 위해 DataType 템플릿을 구체화한 다양한 템플릿 클래스가 OpenCV 3.0은 traits.hpp에 있고 구버전인 2.4.10 은 core.hpp에 있다. 보통 core.hpp가 익숙한 것 같다.


 이는 주로 자료형을 OpenCV 자료형으로 변환하는 목적으로 사용이 된다. 보통 템플릿을 사용한 OpenCV 라이브러리 구측을 위해 이 클래스가 필요하다. 그런데 보통의(?) 사용자는 일반적으로 모두 구현된 라이브러리를 쓸꺼니까... 여기서는 상수 명칭을 사용하게 된다. 깊게 공부할 때 다시 보면 좋을 것 같다. 간단히 예를 들자면


Mat A1(1, 2, DataType<uchar>::type); 이렇게 쓰는 대신

Mat A1(1, 2, CV_8U); 이렇게 상수 명칭으로 쓰겠다는 이야기이다. 




1.2 Point_ 클래스


 OpenCV에서 필수적으로 공부해야하는 Point 클래스이다. 이는 2D 좌표를 표현 할 수 있는 클래스이고 당연히 멤버변수는 x축, y축을 표현하기 위한 x, y가 있다. typedef를 이용하여 정의한 Point2i, Point, Point2f, Point2d 자료형이 있다. 뒤에 붙은 알파벳은 개발자라면 알 수 있듯, int, float, double이다. 그냥 Point로 정의된 것은 Point 클래스의 객체, 즉 인스턴스를 뜻한다. 




1.3 Point3_ 클래스


 2D를 표현하는 Point_ 클래스가 있었다면 Point3_ 클래스는 3D를 표현 할 수 있다. 멤버변수는 x, y, z가 있으며, Point3i, Point3f, Point3d가 있다. 




1.4 Size_ 클래스


 Size 클래스는 이름처럼 크기를 표현할 수 있는 클래스이다. 이 클래스도 빈번히 쓰이는 클래스 중 하나이다. Size2i, Size, Size2f 자료형이 있다. C++ API 이지만, C API의 CvSize, CvSize2D32f로 변환하여 사용할 수도 있다. 




1.5 Rect_ 클래스


 사각형을 표현하는 클래스이다. 멤버변수는 x, y, width, height 가 있다. 오직 정수형에 대한 Rect 자료형이 정의되어있다. 



아래 예제는 간단하게 사각형을 그려보는 예제를 실행해 보았다. 

참고로 색상을 나타내는 함수로써 Scalar(B, G, R) 순서이다.


r1 : 파란색 사각형

r2 : 초록색 사각형 

r3 : r1과 r2 크기를 intersection한 빨간색 사각형 (교집합 개념)

r4 : r1과 r2 크기를 담는 검은색 사각형 (합집합 개념)


pt1 은 좌표상에서 x=100, y=100 지점으로써 원(Circle)으로 표시해두었다. 



 
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){
	
	Rect r1(100, 100, 320, 240), r2(200, 200, 320, 240);
	Point pt1(100, 100);
	Size size(100, 100);

	Rect r3 = r1 & r2; // intersection
	Rect r4 = r1 | r2; // minimum area rectangle containing r1, and rt2

	cout << "r1 :" << r1 << endl;
	cout << "r2 :" << r2 << endl;
	cout << "r3 :" << r3 << endl;
	cout << "r4 :" << r4 << endl;

	if (r1 != r2)
		cout << "r1 and r2 are not the same rectangle." << endl;

	// for drawing r1 ~ r4

	Mat img(600, 800, CV_8UC3); // x=600, y=800, 8bit, unsigned, 3 channels 

	rectangle(img, r1, Scalar(255, 0, 0), 2);
	rectangle(img, r2, Scalar(0, 255, 0), 2);
	rectangle(img, r3, Scalar(0, 0, 255), 2);

	rectangle(img, r4, Scalar(0, 0, 0), 1);
	circle(img, pt1, 5, Scalar(255, 0, 255), 2);

	imshow("image", img);
	waitKey();

	return 0;
 

}




1.6 RotatedRect 클래스


말그래도 회전된 사각형을 표현하는 클래스이다. 멤버 변수는 중심점인 Point2f 자료형의 center와 크기인 Size2f 자료형의 size, 회전각을 나타내는 float 자료형의 angle이 있다. C API의 CvBox2D 구조체와 호환 가능하다. 





728x90
반응형