2011-05-06 31 views
2

我一直使用C API,並試圖將一個簡單的項目轉換爲C++ API來獲取句柄,但我似乎無法弄清楚如何分配C++中的矩陣元素。例如,我有以下的數組:如何在C++ opencv中分配矩陣元素?

double rotation[] = { 0, 1, 0, 
        -1, 0, 0, 
         0, 0, 1 }; 

我有一個3x3墊,用Mat *rotation_vector = new Mat(3,3, CV_64FC1);

在C分配,這將簡單地是cvInitMatHeader(rotation_vector, 3, 3, CV_64FC1, rotation);。這是如何在C++中完成的?

+0

如果C代碼按照您的說法工作(我知道關於opencv的zip),那麼C++代碼將以完全相同的方式工作。你爲什麼認爲你必須使用新的? – 2011-05-06 23:13:08

+0

其實沒有。 cvInitMatHeader只適用於舊的cvMat結構。它們不適用於較新的Mat對象 – glassofwater 2011-05-06 23:30:40

+0

那麼,請不要使用新的東西 - 或者它是否提供了一些新功能?我的觀點是,你的舊C代碼應該在C++下編譯,可能會在這裏和那裏進行強制轉換。 – 2011-05-06 23:39:27

回答

6

你應該使用cv :: Mat對象的一些變體。

對於其中大小是已知的和固定的矩陣,則可以使用CV :: MATX對象:

cv::Matx33d rotation( 0.0, 1.0, 0.0, 
         -1.0, 0.0, 0.0, 
         0.0, 0.0, 1.0); 

對於動態大小,陣列,使用CV ::墊對象

cv::Mat aBigMatrix(53, 71, cv::CV_64FC1, cv::Scalar::all(0.0)); 

這將創建一個寬度爲53,高度爲71的2d矩陣,每個元素是一個64位浮點單通道值(基本上是雙精度值),並且所有元素都將設置爲0。

或者,你可以使用CV :: Mat_模板類,而好處是更清潔的初始化(除其他事項外):

cv::Mat_<double> anotherBigMatrix(53, 71, 0.0); 

這將創建一個等效矩陣上述的一個。

最後,您可以使用該模板矩陣類相似,你會做它在普通的C方式初始化列表:

有許多權衡使用不同的類,所以你應該確保您閱讀OpenCV documentation,讓你選擇一個正確的

1

如果你只是想爲你的已經分配數據的標題,這樣做:

cv::Mat rotation_matrix(3, 3, CV_64FC1, rotation) 

這將使墊這個數據的標題(沒有數據會是copi ED)。如果你想將它複製到一個新的矩陣,你可以這樣做:

cv::Mat new_matrix = rotation_matrix.clone(); 

你不想使用newcv::Mat(在幾乎所有情況下),它是一個引用計數的數據類型 - 把它想成一個聰明的指針。什麼是CvMat*應該是cv::Mat(注意缺少*)。