2015-03-02 110 views
0

我有一个int数组(实际上是一个尺寸为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-卷起尽管尺寸是正确的,我在指针算术上有点生疏,也许我不需要base * s。如果我使用accumulator.at(x,y)也是iiuc,它会明显变慢?

回答

0

尝试:

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次,但到目前为止遇到了内存错误(当我从python中调用这个函数时退出代码139,这是我通常在这些日子里工作的地方);这不可能是由于获取宽度而不是高度I blv。在180,3000阵列的n,r = 32,202处,这个错误发生了一个很短的路径。原始内存通过memset(accum,0,sizeof(accum [0])*(numangle + 2)*(numrho + 2))分配;' – 2015-03-02 17:34:29

+0

memset不分配内存。 – Photon 2015-03-02 17:54:47

+0

好吧你是正确的父亲'AutoBuffer _accum((numangle + 2)*(numrho + 2)); int * accum = _accum;'是分配,这并没有帮助我理解为什么代码仍然崩溃。我不熟悉reinterpret_cast,所以我现在正在尝试'accumulator.at(int)(r,n)= accum [base]',这里又进行了30分钟的编译和测试循环。 – 2015-03-03 09:01:39