2015-08-20 4 views
0

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

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

First-chance exception at 0x74E2C42D in BFBi_test.exe: Microsoft C++ exception: cv::Exception at memory location 0x0045F6B4. First-chance exception at 0x74E2C42D in BFBi_test.exe: Microsoft C++ exception: cv::Exception at memory location 0x0045F6B4. Unhandled exception at at 0x74E2C42D in BFBi_test.exe: Microsoft C++ exception: cv::Exception at memory location 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; 
} 

Однако, вам нужно

save large amount of images using a camera for several hours. I need to find a way to save all this data in a compact, easily accessible form.

Таким образом, вы, вероятно, не хотите, чтобы сохранить все данные в тексте формат в том же файле, но:

  • сохранить компресс ed (jpg) изображения, с imwrite.
  • сохранить исходные двоичные данные. См. Например, here.

 Смежные вопросы

  • Нет связанных вопросов^_^