본문 바로가기
Computer Vision

OpenCV 주요 기능 - 4. OpenCV 데이터 파일 입출력

by ksb0511 2020. 2. 14.

1. FileStorage 클래스

  • Mat 클래스 객체뿐만 아니라 일반적인 C/C++ 자료형 데이터를 XML, JSON 등 파일 형식으로 저장하는 기능을 제공.
  • OpenCV에서 사용하는 데이터의 파일 입출력 기능을 캡슐화하여 지원하는 클래스임.
  • OpenCV 데이터를 저장하거나 읽어 오려면 먼저 FileStorage 객체를 생성해야 함. -> FileStorage fs;
// 실제 사용할 파일 열기
virtual bool FileStorage::open(const String& filename, int flags,
	const String& encoding = String());

 

  • filename에는 데이터 파일 이름을 지정.
  • flags는 파일 열기 모드를 결정. FileStorage::mode 열거형 상수를 지정.
  • encoding 인자에는 xml 파일의 인코딩 형식을 지정하는 문자열을 지정할 수 있음. ( 생략 가능)
FileStorage::mode 열거형 상수 설명
FileStorage::READ 읽기 모드
FileStorage::WRITE 쓰기 모드(새로 생성)
FileStorage::APPEND 추가로 쓰기 모드
FileStorage::MEMORY 논리합 연산자(|)를 이용하여 FileStorage::READ 또는 FileStorage::WRITE 상수와 함께 사용될 경우, 실제 파일 입출력 대신 메모리 버퍼를 이용한 입출력을 수행합니다.
  • FileStorage 클래스 예시)
FileStorage fs;
fs.open("mydata.json", FileStorage::WRITE);

FileStorage fs("mydata.json", FileStorage::WRITE);

 

  • open() 멤버 함수를 이용하여 파일을 열 경우 함수의 반환값을 검사하여 정상 동작을 확인할 수 있으나, FileStorage 생성자를 이용하여 객체 생성과 파일 열기를 한꺼번에 수행할 경우 파일이 정상적으로 열렸는지 따로 확인해야 함.

// 파일이 정상적으로 열렸는 지 확인하는 함수
virtual bool FileStorage::isOpened() const;

 

  • 파일이 정상적으로 열렸으면 true, 그렇지 않으면 false
  • 파일에 데이터를 저장할 때에는 << 연산자 재정의 함수를, 데이터를 읽어오는 작업을 할 때에는 << 연산자 재정의 함수를 사용.

// 파일을 닫는 함수
virtual void FileStorage::release();

 

  • 사용하고 있던 파일을 닫고 메모리 버퍼를 해제

2. 데이터 파일 저장하기

// FileStorage 클래스 객체에 데이터를 저장할 때 사용하는 << 연산자 재정의 함수
template<typename _Tp>
static FileStorage& operator << (FileStorage& fs, const _Tp& value);
static FileStorage& operator << (FileStorage& fs, const String& str);
static FileStorage& operator << (FileStorage& fs, const char* str);

 

  • 파일에 여러 개의 데이터를 저장할 때에는 데이터의 구분을 위한 문자열 형식의 이름을 함께 저장하는데, 먼저 FileStorage 객체에 데이터 이름을 저장하고, 데이터를 저장하는 방식.

3. 데이터 파일 불러오기

  • 실제 사용할 데이터 파일을 읽기 모드로 열어야 함.
  • 읽기 모드로 열면 FileStorage 객체는 파일 전체를 분석하여 계층적 구조를 갖는 노드 집합을 구성. (노드 : 이름과 값으로 구성되어 있는 하나의 데이터)
// 특정 이름으로 저장되어 있는 FileNode 객체에 접근하기 위한 연산자 재정의 함수
FileNode FileStorage::operator[](const char* nodename) const;

 

  • nodename을 이용해 FileNode 객체를 얻어온 후 >> 연산자 재정의 함수를 이용하여 노드에 저장된 데이터를 받아 올 수 있음.

// FileNode 객체와 함께 사용하는 >> 연산자 재정의 함수 원형
template<typename _Tp>
static void operator >> (const FileNode& n, _Tp& value);
template<typename _Tp>
static void operator >> (const FileNode& n, std::vector<_Tp>& vec);

 

  • 연산자를 읽어오려면 >> 연산자 왼쪽에 FileNode 객체 이름을 쓰고, << 연산자 오른쪽에는 받아 올 데이터 형식에 맞는 변수 이름을 적음.
  • 예시 )
int year;
fs["year"] >> year;

댓글