2012-08-27 51 views
18

在我的應用程序中,我想創建一個具有一些值的OpenCV Mat A(2維),然後使用A作爲輸入將它傳遞給另一個OpenCV函數。用2D數組初始化OpenCV Matl

目前,我想:在一維數組的情況下

// float data[2][5] = {{1,2,3,4,5},{7,8,9,10,11}}; 
// OR 
float data[10] = {1,2,3,4,5,7,8,9,10,11}; 

// and then 
// A = Mat(1, 5, CV_32FC1, &data, 2); // init from float 1D - array 
// OR 
    A = Mat(2, 5, CV_32FC1, &data, 2); 

,傳球值確定。但是這對二維數組不起作用,這更常見。我如何解決這個OpenCV?

回答

23

orginally,我使​​用了OpenCV的在線指南助記:

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP) 

但我不明白的文件通過 「爲size_t步= AUTO_STEP」 的意思。這意味着我可以ommit與OpenCV中會自動選擇AUTO_STEP

我試過「步」的說法,這工作:

A = Mat(2, 5, CV_32FC1, &data); 

的2D墊雖然從陣列

16

初始化你答案對你的情況是正確的,這是很好的知道什麼stepAUTO_STEP的意思是

通常,圖像存儲在連續的內存塊。一前一後。每一行,這樣你就可以通過指針與訪問數據的簡單

data = dataPtr[currentCol + width * currentRow]; 

其中寬度是以字節爲單位的行寬(不是以像素爲單位!)

但是,這並不總是大小寫 - 有時你訪問一個子矩陣,並且數據在每一行上都是連續的,但要走到下一行,你必須跳轉一個字節序列。

這是步(也稱爲步幅)進來的地方。它表示兩個連續行之間的距離(以字節爲單位)。在連續矩陣中,其值爲sizeof(pixel)*rowWidth,但在特殊情況下它可能具有自定義值。將AUTO_STEP傳遞給Mat構造函數時,它知道數據是連續的,並使用上面的公式計算該步驟。所以,現在,更正確的方法來讀取像素值是

data = dataPtr[currentCol + step * currentRow]; 

這是適用於各種圖像。

最後,但並非最不重要的,不要忘記,步驟在字節測量,不像素。因此,如果你有一個3通道UCHAR RGB圖像,步驟將是3*number of pixels,如果你有一個3信道INT圖像,step = 3(channels)*(4=sizeof(int))*(number rows)

5

由於data是2D陣列 - 所有的data&data*datadata[0]&data[0],和&data[0][0]指向數組的基數。任何上述表示的可以選擇正確構建Mat代替X

A = Mat(2, 5, CV_32FC1, X); 

要有平和的心態,因爲數據是通過accepted OpenCV的作爲void*和OpenCV的數據訪問是爲line。我更喜歡用單個或多維數組構建Mat的相同語法。

A = Mat(1, 10, CV_32FC1, data); //for 1D array 
A = Mat(2, 5, CV_32FC1, data); //for 2D array 

回到查詢 - 需要注意的是,您甚至從一維數組的Mat建設是不正確。步驟參數被提及爲2.它恰好工作,因爲OpenCV overrides提供了步驟參數,如果行數爲1。對於更高維度的陣列,OpenCV會針對您獲得的錯誤步驟參數引發調試assertion

14

除了上面的答案,還有another option

對於較小的數據,我寧願以下幾點:

Mat A = (Mat_<float>(2, 5) << 1, 2, 3, 4, 5, 7, 8, 9, 10, 11); 

你可以很容易地得到期望的結果,而不需要定義一個額外的變量「數據」。