OpenCv整数数组转换

OpenCv integer array conversion

本文关键字:转换 数组 整数 OpenCv      更新时间:2023-10-16

我有一个int数组(实际上是一个名为accum的变量中的维数为numangle*numrho的图像),我想将其转换为opencv-Mat结构进行显示,但遇到了一点麻烦。我创建了一个OutputArray,并用整数数组中的值填充它的数据;由于OutputArray数据显然是uchar(尽管我声明了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位的图像,尽管尺寸正确。我的指针算术有点生疏,也许我不需要基数。此外,如果我使用累加器。在(x,y)时,它会明显慢一些吗?

尝试:

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);

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