2015-03-02 2 views
0

У меня есть массив ints (изображение размеров numangle * numrho на самом деле, в переменной называется accum), которую я хотел бы преобразовать в структуру opencv Mat для отображения, и у меня небольшая проблема. Я создаю OutputArray и заполняю его данными значениями из целочисленного массива; поскольку данные OutputArray является uchars, по-видимому (хотя я объявил CV_32SC1, который для 32-битных знакового целого 1 канал изображений) Я заполнить его в байтах за байтом следующим образом:Преобразование целочисленного массива OpenCv

int s = sizeof(accum[0]); 
_acc.create(numangle+2,numrho+2,CV_32SC1); 
Mat accumulator = _acc.getMat(); 
for(int r = 0; r < numrho; r++) 
      for(int n = 0; n < numangle; n++) 
      { 
       int base = r * (numangle)+n; 
       accumulator.data[base*s+3] = accum[base] & 0xFF; 
       accumulator.data[base*s+2] = (accum[base]>>8) & 0xFF; 
       accumulator.data[base*s+1] = (accum[base]>>16) & 0xFF; 
       accumulator.data[base*s+0] = (accum[base]>>24) & 0xFF; 
      // accumulator.at(int)(r,n)=accum[base]; 
      } 

Однако я, кажется, ветер с 1- хотя и имеет правильные размеры. Я немного ржавый на моей арифметике указателя, может быть, мне не нужна база. Кроме того, если я должен был использовать accumulator.at (x, y), это было бы значительно медленнее?

ответ

0

Try:

int index=0; 
for(int r = 0; r < numrho; r++) 
{ 
    int* row=reinterpret_cast<int*>(accumulator.ptr(r)); 
    for(int n = 0; n < numangle; n++) 
     row[n]=accum[index++]; 
} 

В качестве альтернативы, если массив является простой буфер, вы можете прикрепить его к изображению (без потери права собственности на буфер), выполнив:

Mat image(numrho,numangle,CV_32SC1,accum); 

Этот подход не копирует данные, которые иногда вы хотите.

+0

спасибо, что выглядит как хороший способ. Я пробовал это время cpl, но до сих пор сталкивался с ошибками памяти (код выхода 139, когда я вызываю это из python, где я обычно работаю в эти дни); это не может быть связано с получением ширины вместо высоты I blv. Ошибка занимает короткое замыкание в n, r = 32202 массива 180,3000. Исходная память выделяется через 'memset (accum, 0, sizeof (accum [0]) * (numangle + 2) * (numrho + 2));' –

+0

memset не выделяет память. – Photon

+0

ОК, вы правы. 'AutoBuffer _accum ((numangle + 2) * (numrho + 2)); int * accum = _accum; 'это распределение, которое не помогает мне понять, почему код по-прежнему падает. Я не знаком с reinterpret_cast, поэтому теперь я пытаюсь «accumulator.at (int) (r, n) = accum [base]», здесь идет еще 30-минутный цикл компиляции и тестирования. –

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