1

cv::Mat保存された を保存して、cv::FileNode反復している に読み込むのに問題があります。を使用して行列をファイルに書き込むことができます

// Data to save
std::vector<cv::Mat> masks;
masks.push_back(cv::Mat::ones(3,3,CV_8UC1));
masks.push_back(cv::Mat::zeros(2,2,CV_8UC1));

// Open file for writing
cv::FileStorage fs(file, cv::FileStorage::WRITE);

// Create node
fs << "data" << "[";
for (size_t i=0; i<masks.size(); ++i)
{
    // Fill each node with data
    fs << "{:";
    // Write other data...
    fs << "mask" << masks.at(i);
    fs << "}";
}
fs << "]";

この方法でファイルを書き込んでも問題はありません。ただし、後でこのファイルを開くと、ハンドルされない例外が発生し、次のように出力されます。

OpenCV エラーの読み取り: 解析エラー (testPR.yml(7): Missing , between the element ts) in unknown function, file ......\modules\core\src\persistence.cpp、行 12 63

マトリックスを読むために、私はこれをやろうとしています:

// Open file for reading
cv::FileStorage fs(file, cv::FileStorage::READ);   ///< This causes an exception

// Open node
cv::FileNode d = fs["data"];
cv::FileNodeIterator it = d.begin(), it_end = d.end();

for( ; it!= it_end; ++it)
{
    // Read other data...
    cv::Mat mask;
    (*it)["mask"] >> mask;
}

確かに、この方法で行列をノードに保存/読み取ることは可能ですよね?

4

2 に答える 2

0

http://docs.opencv.org/modules/core/doc/xml_yaml_persistence.htmlを見ると

YAML (XML ではない) では、マッピングとシーケンスをコンパクトな Python のようなインライン形式で記述できます。上記のサンプルでは、​​行列要素と、その lbp 値を含む各機能が、このようなインライン形式で格納されています。マッピング/シーケンスをコンパクトな形式で保存するには、開始文字の後に「:」を置きます。たとえば、「{」の代わりに「{:」を使用し、「[」の代わりに「[:」を使用します。データが XML に書き込まれるとき、それらの余分な「:」は無視されます。

{:は[:なしでは使用できないかもしれませんが、この機能に関する別のドキュメントは見つかりませんでした。しかし、XMLに保存するソリューションに関しては、余分な「:」は無視されます...

私の意見では、「:」を削除すると、YAML への保存も機能するはずです。

于 2013-04-27T11:58:51.647 に答える
0

.xmlこれに対する解決策は、ファイルではなくデータを保存することであることが判明しましたが、それが.ymlなぜなのかについて私は賢くありません.

于 2012-12-12T16:47:15.247 に答える