使用 OpenCV 在 Mat 中分配



我需要在M(变量类型Mat)中分配值,值CV_32FC1(浮点),但是在10000x10000的大小下需要很长时间。 即:

 for (i=0 ; i<rows; i++)   
   for (j=0 ; j<cols; j++){
      ...build variable NEW_VALUE for indexes i, j
      M.at<float>(i,j) = NEW_VALUE   
   }

上面的代码需要 1 秒 aprox。我看到的另一种形式是定义联合(复制字节):

typedef union{float _float;  uchar _uchar[4];} Bits;
...
Bits bits;
float new_value;
for (i=0 ; i<rows; i++)
  for (j=0 ; j<cols; j+=4){
     ...//build variable new_value for indexes i, j
     bits._float = new_value;
     M.data[i*cols + j] = bits._uchar[0];
     M.data[i*cols + j+1] = bits._uchar[1];
     M.data[i*cols + j+2] = bits._uchar[3];
     M.data[i*cols + j+3] = bits._uchar[3];
  }

这比第一个要快得多。但不起作用。我尝试做:

 memcpy(&M.data[i*cols + j], bits._uchar[0], 1);
 memcpy(&M.data[i*cols + j+1], bits._uchar[1], 1);
 ...

但不起作用。

和:

 memcpy(&M.at<float>(i,j), bits._uchar, 4);

也很慢。

我需要知道如何在 M 内正确复制new_value的字节

您的代码很慢,因为您要对每个像素执行大量计算。乘法运算不是一个便宜的操作,你可以多次使用它,无论是显式(i*cols + j)还是隐式(at(i,j))。阅读本教程,以更好地了解如何有效地访问像素。

你可以做这样的事情:

float *prtM=(float*)M.data;
for (i=0 ; i<rows; i++)   
   for (j=0 ; j<cols; j++){
       //...build variable NEW_VALUE for indexes i, j
       *prtM = NEW_VALUE;
       prtM++;
   }
float* p;
for (i=0 ; i<rows; i++)  
{
    p = M.ptr<float>(i);
    for (j=0 ; j<cols; j++)
    {
        *p++ = NEW_VALUE;
    }
}

PAGHDV 的代码是优化最好的代码,但如果矩阵中的值不连续,则不起作用。

相关内容

  • 没有找到相关文章

最新更新