OpenCv整数数组转换

时间:2015-03-02 10:53:59

标签: c++ arrays opencv pixel

我有一个int数组(实际上是一个维度为numangle * numrho的图像,在一个名为accum的变量中),我想将其转换为opencv Mat结构进行显示,并且遇到了一些麻烦。我创建一个OutputArray并用整数数组中的值填充其数据;因为OutputArray数据显然是uchars(即使我声明CV_32SC1是32位有符号整数1通道图像),我按字节填写如下:

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位图像,尽管尺寸正确。我的指针算术有点生疏,也许我不需要基数* s。如果我使用accumulator.at(x,y),它会明显变慢吗?

1 个答案:

答案 0 :(得分: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);

这种方法不会复制数据,这有时是你想要的。