0

カメラを使用して数時間にわたって大量の画像を取得して保存する必要があります。私は BitFlow SDK を使用してカメラの取得を処理し、OpenCV を主に表示と画像処理に使用しています。このすべてのデータをコンパクトでアクセスしやすい形式で保存する方法を見つける必要があります (複数ページの tiff ファイルを作成することが最初の目的でしたが、それに関するサポートはほとんどありません)。

とにかく、OpenCV の FileStorage クラスを使用して複数の画像を 1 つの YAML ファイルに保存しようとしていますが、あまり成功していません。作成した YAML ファイルから1 つのイメージを正常に書き込み、読み取ることができますが、<< 演算子を使用してファイルに複数の Mat オブジェクトを配置しようとするとすぐに、次のエラーが発生します。

BFBi_test.exe の 0x74E2C42D での初回例外: Microsoft C++ 例外: cv::Exception at memory location 0x0045F6B4. BFBi_test.exe の 0x74E2C42D での初回例外: Microsoft C++ 例外: cv::Exception at memory location 0x0045F6B4. BFBi_test.exe の 0x74E2C42D で未処理の例外: Microsoft C++ 例外: cv::Exception メモリ位置 0x0045F6B4 で。

私のコードの一部:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "resource.h"
#include "SequenceInterface.h"

#include "opencv2/core/core.hpp"
#include "persistence.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{   
    // Control variables
    BFU32   numBuffers = 10;    // Allocate 10 buffers
    BFU32   setupOptions = 0;   // Use default setup options.

    FileStorage firstImg("FirstImage.yml", FileStorage::WRITE);
    FileStorage secondImg("SecondImage.yml", FileStorage::WRITE);

    cout << "Creating instance of sequence interface." << endl;
    SequenceInterface board(0, numBuffers, 0);
    PBFU32* pBufferArray= board.getBufferArrayPointers();

    Mat test(Size(1024, 1024),CV_8UC1, (void *)pBufferArray[0], (size_t)1024);
    Mat test2(Size(1024, 1024),CV_8UC1, (void *)pBufferArray[1], (size_t)1024);

// -- Acquisition done here --- 
...
...
// -- End of acquisition --  

    firstImg<<"firsttest"<< test;
    firstImg<< "secondtest" << test2; // Runtime error on this line;
    firstImg.release();

}

test2 を secondImg に書いても問題ありません。また、ランダムな文字列オブジェクトを firstImg に追加しようとしましたが、そこにも問題はありません。XML に切り替えても、何も変わりませんでした。YAML ファイルの最大サイズはありますか?それは、私の画像がその用途には大きすぎることを意味しますか?

4

1 に答える 1

1

同じように、複数の を同じに書き込むことができます。おそらく、コードの他の部分に問題があります。MatFileStorage

たとえば、これは期待どおりに機能します。

#include <opencv2\opencv.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main()
{
    vector<uchar> v1(1024 * 1024, 7);
    vector<uchar> v2(1024 * 1024, 9);

    Mat m1(1024, 1024, CV_8UC1, v1.data(), 1024);
    Mat m2(1024, 1024, CV_8UC1, v2.data(), 1024);

    FileStorage fs("test.yml", FileStorage::WRITE);
    fs << "m1" << m1;
    fs << "m2" << m2;

    return 0;
}

ただし、次のことを行う必要があります。

カメラを使用して大量の画像を数時間保存します。このすべてのデータをコンパクトでアクセスしやすい形式で保存する方法を見つける必要があります。

したがって、すべてのデータを同じファイルにテキスト形式で保存したくない場合がありますが、次のようになります。

  • 圧縮 ( jpg ) 画像をimwrite.
  • 生のバイナリ データを保存します。たとえば、ここを参照してください。
于 2015-08-21T11:40:18.963 に答える