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

How to allocate the elements of a matrix in c++ opencv?

本文关键字:元素 分配 c++ opencv      更新时间:2023-10-16

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

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++中是如何实现的?

您应该使用cv::Mat对象的一些变体

对于大小已知且固定的小矩阵,可以使用cv:: matrix对象:

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文档,以便你选择正确的

如果您只想为已经分配的数据创建一个头,请执行:

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

这将使Mat成为该数据的标头(不会复制数据)。如果你想把它复制到一个新的矩阵,你可以这样做:

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

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