我需要使用值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的字节答案 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的代码是最优化的代码,但如果矩阵中的值不连续,则无效。