[英]How to allocate the elements of a matrix in 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 ++中完成?
您应该使用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 ) );
这将创建一个2维矩阵,其宽度为53,高度为71,每个元素都是64位浮点单通道值(基本上是double),并且所有元素都将设置为0。
另外,您可以使用cv :: Mat_模板类,这样做的好处是初始化更简洁(尤其是):
cv::Mat_<double> anotherBigMatrix( 53, 71, 0.0 );
这将创建与上述矩阵等效的矩阵。
最后,可以将模板矩阵类与初始化列表一起使用,类似于在常规C语言中进行初始化的方式:
使用不同的类时需要权衡取舍,因此您应确保已阅读OpenCV文档,以便选择正确的类。
如果只想为已分配的数据创建标题,请执行以下操作:
cv::Mat rotation_matrix(3, 3, CV_64FC1, rotation)
这将使Mat成为此数据的标头(不会复制任何数据)。 如果要将其复制到新矩阵,可以执行以下操作:
cv::Mat new_matrix = rotation_matrix.clone();
您不想在cv::Mat
使用new
(在几乎所有情况下),它是一个引用计数的数据类型-将其视为智能指针。 什么是CvMat*
应该是cv::Mat
(请注意缺少*
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.