如何在c ++ opencv中分配矩阵的元素?

时间:2011-05-06 23:04:11

标签: c++ opencv

我一直使用C API,并试图将一个简单的项目转换为C ++ API来获取它的句柄,但我似乎无法弄清楚如何在C ++中分配矩阵的元素。例如,我有以下数组:

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

我有一个3x3 Mat,分配了Mat *rotation_vector = new Mat(3,3, CV_64FC1);

在C中,它只是cvInitMatHeader(rotation_vector, 3, 3, CV_64FC1, rotation);。这是如何在C ++中完成的?

2 个答案:

答案 0 :(得分: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 :: Mat对象

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 :(得分:1)

如果您只想为已分配的数据创建标题,请执行以下操作:

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

这将使Mat成为此数据的标题(不会复制任何数据)。如果要将其复制到新矩阵,可以执行以下操作:

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

您不希望newcv::Mat一起使用(几乎在所有情况下),它是一个引用计数数据类型 - 将其视为智能指针。 CvMat*的内容应为cv::Mat(请注意缺少*)。