2015-08-07 4 views
-1

Я пытаюсь написать большую матрицу float в формате OpenCV Mat для двоичного файла. Я на виртуальной коробке с Linux x64.Написать большой макет OpenCv

И у меня раздавлен счетчик 536000000, так что кажется, что у меня переполнение int вокруг «подозрительной строки» в p + i * 4? (кстати, assert не обнаруживает этот случай, почему?).

Так что, когда я меняю «int i» на «int64 i», все выглядит нормально, но я не уверен, можно ли добавить больше 2^32 в указатель char *?

Кроме того, каков максимальный размер матрицы OpenCV?

bool WriteFloatMat(string path, const Mat &img) 
    { 
     ofstream fs(path, ios::binary); 

     fs.write((char*)&(img.cols), 4); 
     fs.write((char*)&(img.rows), 4); 

     int64 sz_ = img.cols*img.rows;// 
     assert(sz_ < numeric_limits<int>::max());// 

     int sz = img.cols*img.rows; 
     cout << sz << endl; 
     int64 counter=0; 
     int64 maxVal= numeric_limits<int>::max(); 
     char* p= image.ptr<char>(); 
     for(int i=0; i<sz; ++i) 
     { 
      assert(i*4 < numeric_limits<int>::max());//suspicious line 
      fs.write(p+i*4, 4); 
      ++counter; 
      if(counter%1000000==0) 
       cout << counter << endl; 
      if(counter>maxVal) 
       cout << "Out of limits!" << endl; 
     } 

     return true; 
    } 


void TestIO() 
{ 
    //max matrix dimensions? 
    int rows= 1000*1000*10; 
    int cols= 100; 
    Mat mat(rows,cols,CV_32FC1); 
    mat=mat+7; 

    double t = (double)getTickCount(); 
    WriteFloatMat("/media/dummy.big", mat); 
    t = ((double)getTickCount() - t)/getTickFrequency(); 
    cout << "Times passed in seconds: " << t << endl; 
} 

Update: Я понимаю, почему assert(i*4 < numeric_limits<int>::max()); не работает, потому что я * 4 переполнения и <-так assert(i*4 >=0); работы.

+0

Почему вы пишете одно значение в то время? не можете ли вы сразу написать всю матрицу данных? Посмотрите [здесь] (http://stackoverflow.com/a/31584182/5008845) для примера – Miki

+0

@Miki Есть ли ограничения 'ofs.write', потому что я хочу писать большие файлы> 4Gb? – mrgloom

+0

Вы должны быть в порядке с файлом> 4Gb. – Miki

ответ

1

OpenCV не имеет внутренних ограничений на размер изображения, который он действительно рассматривает как блок памяти. Таким образом, ограничения будут связаны с используемой системой C++.

Для того, что стоит, я нашел функциональность numeric_cast<> в числовой библиотеке boost, чтобы быть очень полезной, чтобы поймать ошибки преобразования, как вы столкнулись с assert(i*4 < numeric_limits<int>::max()). (Конечно, эта проблема была тонкой, поэтому она, возможно, тоже не помогла.)

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