Невозможно поместить более одного объекта Mat в файл YAML с использованием OpenCV

Мне нужно получить и сохранить большое количество изображений с помощью камеры в течение нескольких часов. Я использую BitFlow SDK для обработки захвата камеры и OpenCV в основном для отображения и обработки изображений. Мне нужно найти способ сохранить все эти данные в компактной, легко доступной форме (создание многостраничных TIFF-файлов было первой целью, но поддержки в этом практически не было).

В любом случае, сейчас я пытаюсь сохранить несколько изображений в одном файле YAML, используя класс FileStorage OpenCV без особого успеха. Я могу успешно написать, а затем прочитать один изображение из файла YAML, который я создал, но как только я пытаюсь поместить в файл более одного объекта Mat, используя << Оператор, я получаю следующую ошибку:

Исключение первого шанса в 0x74E2C42D в BFBi_test.exe: Microsoft C ++ исключение: cv :: Исключение в ячейке памяти 0x0045F6B4.
Исключение первого шанса в 0x74E2C42D в BFBi_test.exe: Microsoft C ++ исключение: cv :: Исключение в ячейке памяти 0x0045F6B4.
Необработанное исключение в 0x74E2C42D в BFBi_test.exe: 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, означающий, что мои изображения слишком велики для такого использования?

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

Тем не менее, вам нужно

сохранить большое количество изображений с помощью камеры в течение нескольких часов. Мне нужно найти способ сохранить все эти данные в компактной, легко доступной форме.

Поэтому вы, вероятно, не хотите сохранять все свои данные в текстовом формате в одном файле, но:

  • сохранить сжатый (JPG) изображения, с imwrite,
  • сохранить сырые двоичные данные. Увидеть Вот например.
0

Другие решения


По вопросам рекламы [email protected]