我一直使用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 ++中完成的?
答案 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();
您不希望new
与cv::Mat
一起使用(几乎在所有情况下),它是一个引用计数数据类型 - 将其视为智能指针。 CvMat*
的内容应为cv::Mat
(请注意缺少*
)。