パラメータ(カメラパラメータや学習したパラメータ)をOpenCVを通じて保存する方法
大体こちらに¬e{XML-opencvjp:ファイルへのXML/YAML形式でのデータ保存/読み込み | OpenCV.jp};に書いてある内容で充分
variable v の型に応じて多重定義されてる
Cインタフェース版
#geshi(c++,number){{
#include "opencv2/core/core.hpp"
int main(){
cv::FileStorage fs; fs.open("test.xml", cv::FileStorage::WRITE); // READ と WRITE と APPEND は FileStorage 内にて enum で定義されてる
// indexという名前で値を保存 int index = 1; cv::write(fs, "index", index);
// 複数のデータを書き出す場合 cv::Rect aRect(200, 300, 100, 100); cv::WriteStructContext ws(fs, "Rectangles", CV_NODE_SEQ + CV_NODE_FLOW); for(int i = 0;i < 10;i++){ cv::write(fs, aRect); } return 0;
} }}
<?xml version="1.0"?> <opencv_storage> <index>1</index> <Rectangles> 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100</Rectangles> </opencv_storage>
オブジェクトで書き出そうとしたらハマった
#geshi(c++,number){{
#include "opencv2/core/core.hpp"
int main(){
cv::FileStorage fs; fs.open("test.xml", cv::FileStorage::WRITE); // READ と WRITE と APPEND は FileStorage 内にて enum で定義されてる
cv::WriteStructContext ws(fs, "Region1", CV_NODE_SEQ + CV_NODE_FLOW); cv::Rect aRect(200, 300, 100, 100); cv::write(fs, "region1", aRect);
return -1;
} }};
OpenCV Error: Bad argument (An attempt to add element without a key to a map, or add element with key to sequence) in unknown function, file ..\..\..\modules\core\src\persistence.cpp, line 2198
名前を降らなくても,配列を複数書き出そうとしたらこける
#geshi(c++,number){{
#include "opencv2/core/core.hpp"
int main(){
cv::FileStorage fs; fs.open("test.xml", cv::FileStorage::WRITE);
cv::Rect aRect(200, 300, 100, 100); cv::WriteStructContext ws(fs, "Faces1", CV_NODE_SEQ); for(int i = 0;i < 10;i++){ cv::write(fs, aRect); } cv::WriteStructContext ws2(fs, "Faces2", CV_NODE_SEQ); // <- ここで死ぬ for(int i = 0;i < 10;i++){ cv::write(fs, aRect); }
return -1;
} }}
OpenCV Error: Bad argument (An attempt to add element without a key to a map, or add element with key to sequence) in unknown function, file ..\..\..\modules\core\src\persistence.cpp, line 2198
<?xml version="1.0"?> <opencv_storage> <Faces1> 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300
OpenCV Error: Unspecified error (An extra closing tag) in unknown function, file ..\..\..\modules\core\src\persistence.cpp, line 2320
配列を複数書きだす場合はこう書く
#geshi(c++,number){{
#include "opencv2/core/core.hpp"
int main(){
cv::FileStorage fs; fs.open("test.xml", cv::FileStorage::WRITE);
cv::Rect aRect(200, 300, 100, 100); { cv::WriteStructContext ws(fs, "Faces1", CV_NODE_SEQ); for(int i = 0;i < 10;i++){ cv::write(fs, aRect); } } // <- ****ここで無駄にブラケットで区切ることにより ws がここで消滅してデストラクタが呼ばれる { cv::WriteStructContext wsq(fs, "Faces2", CV_NODE_SEQ); for(int i = 0;i < 10;i++){ cv::write(fs, aRect); } } return -1;
}}
<?xml version="1.0"?> <opencv_storage> <Faces1> 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100</Faces1> <Faces2> 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100 200 300 100 100</Faces2> </opencv_storage>
ジャンル:OpenCV 2.3:OpenCV準拠