opencv(c++)파일 입 출력 은 XML 과 YAML 파일 을 사용 합 니 다.
22316 단어 opencv
File Input and Output using XML and YAML files
당신 은 다음 문제 의 답 을 찾 을 수 있 습 니 다.
소스 코드
여기에서 다운로드 하거나 OpenCV 소스 코드 라 이브 러 리 의 samples/cpp/tutorialcode / core / file_input_output / file_input_output.cpp 에서 찾 을 수 있 습 니 다.
다음은 목표 목록 에 열 거 된 모든 것 을 어떻게 실현 하 는 지 에 대한 예제 코드 입 니 다.
#include
#include
#include
using namespace cv;
using namespace std;
static void help(char** av)
{
cout << endl
<< av[0] << " shows the usage of the OpenCV serialization functionality." << endl
<< "usage: " << endl
<< av[0] << " outputfile.yml.gz" << endl
<< "The output file may be either XML (xml) or YAML (yml/yaml). You can even compress it by "
<< "specifying this in its extension like xml.gz yaml.gz etc... " << endl
<< "With FileStorage you can serialize objects in OpenCV by using the << and >> operators" << endl
<< "For example: - create a class and have it serialized" << endl
<< " - use it to read and write matrices." << endl;
}
class MyData
{
public:
MyData() : A(0), X(0), id()
{}
explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion
{}
void write(FileStorage& fs) const //Write serialization for this class
{
fs << "{" << "A" << A << "X" << X << "id" << id << "}";
}
void read(const FileNode& node) //Read serialization for this class
{
A = (int)node["A"];
X = (double)node["X"];
id = (string)node["id"];
}
public: // Data Members
int A;
double X;
string id;
};
//These write and read functions must be defined for the serialization in FileStorage to work
static void write(FileStorage& fs, const std::string&, const MyData& x)
{
x.write(fs);
}
static void read(const FileNode& node, MyData& x, const MyData& default_value = MyData()){
if(node.empty())
x = default_value;
else
x.read(node);
}
// This function will print our custom class to the console
static ostream& operator<const MyData& m)
{
out << "{ id = " << m.id << ", ";
out << "X = " << m.X << ", ";
out << "A = " << m.A << "}";
return out;
}
int main(int ac, char** av)
{
if (ac != 2)
{
help(av);
return 1;
}
string filename = av[1];
{ //write
Mat R = Mat_::eye(3, 3),
T = Mat_<double>::zeros(3, 1);
MyData m(1);
FileStorage fs(filename, FileStorage::WRITE);
fs << "iterationNr" << 100;
fs << "strings" << "["; // text - string sequence
fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";
fs << "]"; // close sequence
fs << "Mapping"; // text - mapping
fs << "{" << "One" << 1;
fs << "Two" << 2 << "}";
fs << "R" << R; // cv::Mat
fs << "T" << T;
fs << "MyData" << m; // your own data structures
fs.release(); // explicit close
cout << "Write Done." << endl;
}
{//read
cout << endl << "Reading: " << endl;
FileStorage fs;
fs.open(filename, FileStorage::READ);
int itNr;
//fs["iterationNr"] >> itNr;
itNr = (int) fs["iterationNr"];
cout << itNr;
if (!fs.isOpened())
{
cerr << "Failed to open " << filename << endl;
help(av);
return 1;
}
FileNode n = fs["strings"]; // Read string sequence - Get node
if (n.type() != FileNode::SEQ)
{
cerr << "strings is not a sequence! FAIL" << endl;
return 1;
}
FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
for (; it != it_end; ++it)
cout << (string)*it << endl;
n = fs["Mapping"]; // Read mappings from a sequence
cout << "Two " << (int)(n["Two"]) << "; ";
cout << "One " << (int)(n["One"]) << endl << endl;
MyData m;
Mat R, T;
fs["R"] >> R; // Read cv::Mat
fs["T"] >> T;
fs["MyData"] >> m; // Read your own structure_
cout << endl
<< "R = " << R << endl;
cout << "T = " << T << endl << endl;
cout << "MyData = " << endl << m << endl << endl;
//Show default behavior for non existing nodes
cout << "Attempt to read NonExisting (should initialize the data structure with its default).";
fs["NonExisting"] >> m;
cout << endl << "NonExisting = " << endl << m << endl;
}
cout << endl
<< "Tip: Open up " << filename << " with a text editor to see the serialized data." << endl;
return 0;
}
설명 하 다.
여기 서 우 리 는 XML 과 YAML 파일 에 대한 입력 만 토론 합 니 다.출력(그리고 각자 의 입력)파일 은 이 확장자 중 하나 와 여기에서 온 구조 일 수 있 습 니 다.이들 은 직렬 화 할 수 있 는 두 가지 데이터 구조 이다.맵(예 를 들 어 STL 맵)과 요소 서열(예 를 들 어 STL 벡터)이다.그것들 사이 의 차 이 는 지도 에서 모든 요소 가 하나의 유일한 이름 을 가지 고 있 으 며,당신 을 통 해 그것 을 방문 할 수 있 는 것 이다.시퀀스 에 대해 서 는 그것들 을 통 해 특정 항목 을 조회 해 야 합 니 다.
1.XML/YAML 파일 을 열 고 닫 습 니 다.이 파일 들 의 모든 내용 을 쓰기 전에 열 고 마지막 으로 닫 아야 합 니 다.OpenCV 의 XML/YAML 데이터 구 조 는 cv:FileStorage 입 니 다.하 드 디스크 에 연 결 된 이 구 조 를 지정 하려 면 구조 함수 나 open()함 수 를 사용 할 수 있 습 니 다.
string filename = "I.xml";
FileStorage fs(filename, FileStorage::WRITE);
//...
fs.open(filename, FileStorage::READ);
두 번 째 인자 중 하 나 를 사용 하면 상수 입 니 다.그 위 에서 실행 할 수 있 는 동작 유형 을 지정 합 니 다:WRITE,READ 또는 APPEND.파일 이름 에서 지정 한 확장자 도 사용 할 출력 형식 을 결정 합 니 다.*.xml.gz*와 같은 확장 자 를 지정 하면 출력 이 압축 될 수 있 습 니 다.
이 파일 은 cv::FileStorage 대상 이 소각 되 었 을 때 자동 으로 닫 힙 니 다.단,함수 방출 을 통 해 명확 하 게 호출 할 수 있 습 니 다.
fs.release(); // explicit close
2.텍스트 와 숫자 를 입력 하고 출력 합 니 다.데이터 구 조 는 STL 라 이브 러 리 와 같은<
fs << "iterationNr" << 100;
읽 기 는 간단 한 주소 지정([]연산 자 를 통 해)과 주조 작업 또는>>연산 자 를 통 해 읽 습 니 다.
int itNr;
fs["iterationNr"] >> itNr;
itNr = (int) fs["iterationNr"];
3.OpenCV 데이터 구조의 입 출력.그러면 이러한 행 위 는 기본 적 인 C++유형 과 같다.
Mat R = Mat_::eye (3, 3),
T = Mat_::zeros(3, 1);
fs << "R" << R; // Write cv::Mat
fs << "T" << T;
fs["R"] >> R; // Read cv::Mat
fs["T"] >> T;
4.벡터(배열)와 관련 된 맵 의 입 출력.내 가 전에 언급 한 바 와 같이 우 리 는 지도 와 서열(배열,벡터)을 출력 할 수 있다.다시 한 번,우 리 는 먼저 변수의 이름 을 인쇄 한 다음 에 출력 이 시퀀스 인지 매 핑 인지 지정 해 야 합 니 다.
첫 번 째 요소 의 이전 시퀀스 에 대해"["문 자 를 인쇄 하고 마지막 에"]"문 자 를 인쇄 합 니 다.
fs << "strings" << "["; // text - string sequence
fs << "image1.jpg" << "Awesomeness" << "baboon.jpg";
fs << "]"; // close sequence
지도 연습 은 같 지만 지금 우 리 는"{"와"}"구분자 를 사용 합 니 다.
fs << "Mapping"; // text - mapping
fs << "{" << "One" << 1;
fs << "Two" << 2 << "}";
이 를 읽 기 위해 서 는 cv:FileNode 와 cv:FileNodeIterator 데이터 구 조 를 사용 합 니 다.cv::FileStorage 클래스 의[]연산 자 는 cv::FileNode 데이터 형식 을 되 돌려 줍 니 다.노드 가 순서 라면 cv:FileNodeIterator 교체 항목 을 사용 할 수 있 습 니 다.
FileNode n = fs["strings"]; // Read string sequence - Get node
if (n.type() != FileNode::SEQ)
{
cerr << "strings is not a sequence! FAIL" << endl;
return 1;
}
FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
for (; it != it_end; ++it)
cout << (string)*it << endl;
maps 에 대해 서 는 주어진 항목(또는>연산 자)에[]연산 자 를 다시 사용 할 수 있 습 니 다.
n = fs["Mapping"]; // Read mappings from a sequence
cout << "Two " << (int)(n["Two"]) << "; ";
cout << "One " << (int)(n["One"]) << endl << endl;
6.자신의 데이터 구 조 를 읽 고 쓰 세 요.다음 과 같은 데이터 구 조 를 가지 고 있다 고 가정 하 십시오.
class MyData
{
public:
MyData() : A(0), X(0), id() {}
public: // Data Members
int A;
double X;
string id;
};
OpenCV I/O XML/YAML 인터페이스(예 를 들 어 OpenCV 데이터 구조의 경우)에서 클래스 내부 와 외부 에 읽 기와 쓰기 기능 을 추가 하여 직렬 화 할 수 있 습 니 다.내부 부분:
void write(FileStorage& fs) const //Write serialization for this class
{
fs << "{" << "A" << A << "X" << X << "id" << id << "}";
}
void read(const FileNode& node) //Read serialization for this class
{
A = (int)node["A"];
X = (double)node["X"];
id = (string)node["id"];
}
그러면 클래스 외 에 아래 함수 정 의 를 추가 해 야 합 니 다.
void write(FileStorage& fs, const std::string&, const MyData& x)
{
x.write(fs);
}
void read(const FileNode& node, MyData& x, const MyData& default_value = MyData())
{
if(node.empty())
x = default_value;
else
x.read(node);
}
여기 서 read 부분 에서 사용자 가 존재 하지 않 는 노드 를 읽 으 려 고 하면 어떻게 되 는 지 관찰 할 수 있 습 니 다.이러한 상황 에서 우 리 는 기본 초기 화 값 만 되 돌려 주지 만 더 자세 한 해결 방안 은 대상 ID 에 마이너스 값 을 되 돌려 주 는 것 입 니 다.
이 네 개의 함 수 를 추가 하면>>연산 자 를 사용 하여 쓰기 작업 을 하고<
MyData m(1);
fs << "MyData" << m; // your own data structures
fs["MyData"] >> m; // Read your own structure_
혹은 non-existing read 를 읽 어 보 세 요:
fs["NonExisting"] >> m; // Do not add a fs << "NonExisting" << m command for this to work
cout << endl << "NonExisting = " << endl << m << endl;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ip camera android에 액세스하고 java를 사용하여 모니터에 표시그런 다음 PC에서 다운로드 폴더를 추출해야 합니다 그런 다음 프로젝트 폴더에 다운로드한 javacv 라이브러리를 추가해야 합니다. 먼저 라이브러리 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 jar/폴더 추가를 선택...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.