Мне нужно получить и сохранить большое количество изображений с помощью камеры в течение нескольких часов. Я использую 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, означающий, что мои изображения слишком велики для такого использования?
Вы Можно написать несколько 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
,