【问题标题】:OpenCv integer array conversionOpenCv 整数数组转换
【发布时间】:2015-03-02 10:53:58
【问题描述】:

我有一个整数数组(实际上是一个维度为 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 位图像。我的指针算术有点生疏,也许我不需要 base*s 。 iiuc 如果我使用 accumulator.at(x,y) 会显着变慢吗?

【问题讨论】:

    标签: c++ arrays opencv pixel


    【解决方案1】:

    试试:

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

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

    【讨论】:

    • 谢谢,这看起来是个好方法。我已经尝试了 cpl 次,但到目前为止遇到了内存错误(当我从 python 调用它时退出代码 139,这是我这些天通常工作的地方);这不可能是因为我得到了宽度而不是高度。错误在 180,3000 数组的 n,r=32,202 处发生了短暂的变化。原始内存是通过memset( accum, 0, sizeof(accum[0]) * (numangle+2) * (numrho+2) ); 分配的
    • memset 不分配内存。
    • 好吧,你是对的,父亲AutoBuffer&lt;int&gt; _accum((numangle+2) * (numrho+2)); int *accum = _accum; 是分配,这并不能帮助我理解为什么代码仍然崩溃。我对 reinterpret_cast 不熟悉,所以我现在正在尝试 accumulator.at(int)(r,n)=accum[base] ,这是另一个 30 分钟的编译和测试周期。
    • 好的 accumulator.at 版本有效。为了我自己的好奇心和可能更快的代码,我将重试索引版本,看看现在我有 gdb 与 opencv 一起工作的情况。
    猜你喜欢
    • 2016-10-22
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多