2011-05-06 67 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(注意缺少*)。