使用OpenCV在Mat中分配

时间:2014-02-11 21:10:41

标签: opencv mat

我需要使用值CV_32FC1(float)在M(变量类型Mat)中赋值,但是长度大小为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的字节

3 个答案:

答案 0 :(得分:1)

您的代码很慢,因为您正在为每个像素执行大量计算。乘法运算不是一个便宜的操作,你可以显式地(i * cols + j)或隐式地(在&lt; float&gt;(i,j))多次使用它。请阅读this tutorial,以便更好地了解如何有效访问像素。

答案 1 :(得分:0)

您可以这样做:

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++;
   }

答案 2 :(得分:0)

float* p;
for (i=0 ; i<rows; i++)  
{
    p = M.ptr<float>(i);
    for (j=0 ; j<cols; j++)
    {
        *p++ = NEW_VALUE;
    }
}

paghdv的代码是最优化的代码,但如果矩阵中的值不连续,则无效。