2014-02-11 27 views
0

我需要在值爲CV_32FC1(float)的M(變量類型Mat)中分配值,但長時間大小爲10000x10000。即:使用OpenCV分配到Mat中

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

很慢也。

我需要知道如何將NEW_VALUE的字節在M中

回答

1

你的代碼是緩慢的,因爲你執行的是大量的計算每個像素的正確複製。乘法運算不是一個便宜的操作,你可以明確地(i * cols + j)或隱式(在< float>(i,j))多次使用它。閱讀this tutorial以更好地瞭解如何有效地訪問像素。

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

您正在將NEW_VALUE設置爲指針,而不是它指向的數據。 –

+0

ups,我錯過了*那邊,謝謝@MichaelBurdinov – paghdv

+0

不客氣。但請注意,此方法僅適用於內存中連續的圖像,即您的圖像不是某個較大圖像的ROI。要解決這個問題,你可以使用'float * prtM = M.ptr (i);'爲每一行。 –

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

paghdv的代碼是最好的優化之一,但如果值的int矩陣是不連續將無法正常工作。