使用OpenCV在Mat中指定

使用OpenCV在Mat中指定,opencv,mat,Opencv,Mat,我需要用CV_32FC1(float)的值在M(一个变量类型Mat)中赋值,但是在10000x1000的大小下时间很长。i、 e: 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 } 但不起作用 以及: memcpy(&M.a

我需要用CV_32FC1(float)的值在M(一个变量类型Mat)中赋值,但是在10000x1000的大小下时间很长。i、 e:

 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   
   }
但不起作用

以及:

memcpy(&M.at(i,j),bits.uchar,4);
也很慢


我需要知道如何在M的范围内正确复制新_值的字节

您的代码很慢,因为您要对每个像素执行大量计算。乘法运算不是一种便宜的运算,您可以显式(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*prtM=(float*)M.data;
对于(i=0;i
float*p;

对于(i=0;iyou正在将新的_值设置为指针,而不是指针指向的数据。ups,我错过了那里的*号,谢谢@MichaelBurdinovYou。但是请注意,这种方法仅适用于内存中连续的图像,即,您的图像不是某个较大图像的ROI。要解决此问题,您可以使用'float*prtM=M.ptr(i)每行。
 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);
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;
    }
}