繁体   English   中英

如何在C ++ OpenCV中分配矩阵的元素?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM