不能使用OpenCV在YAML文件中放置多个Mat对象

时间:2015-08-20 21:12:32

标签: c++ opencv file-storage

我需要使用相机获取并保存大量图像数小时。我正在使用BitFlow SDK处理相机采集和OpenCV主要用于显示和图像处理。我需要找到一种方法来以紧凑,易于访问的形式保存所有这些数据(创建多页tiff文件是第一个目标,但几乎没有任何支持)。

无论如何,我现在尝试使用OpenCV的FileStorage类在一个YAML文件中保存多个图像,但没有那么成功。我可以成功写入然后从我创建的YAML文件中读取一个图像,但是一旦我尝试使用<<<<<<<运算符,我收到以下错误:

  

BFBi_test.exe中0x74E2C42D的第一次机会异常:Microsoft C ++异常:cv ::内存位置0x0045F6B4的异常。   BFBi_test.exe中0x74E2C42D的第一次机会异常:Microsoft C ++异常:cv ::内存位置0x0045F6B4的异常。   BFBi_test.exe中0x74E2C42D处的未处理异常:Microsoft C ++异常:cv ::内存位置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文件的最大大小是否意味着我的图像太大而无法使用?

1 个答案:

答案 0 :(得分:0)

可以将多个Mat写入同一个FileStorage,就像你一样。可能你的代码的其他部分有问题。

例如,这可以按预期工作:

#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;
}

但是,你需要

  

使用相机保存大量图像数小时。我需要找到一种方法,以紧凑,易于访问的形式保存所有这些数据。

因此,您可能不希望将所有数据以文本格式保存在同一文件中,但是:

  • 使用imwrite保存压缩的( jpg )图片。
  • 保存原始二进制数据。例如,请参阅here