特征:为地图赋值

时间:2017-04-11 14:55:29

标签: c++ opencv matrix eigen

我正在使用带有Eigen的opencv。

以下是如何将opencv Mat链接到Eigen Matrix的示例: OpenCV CV::Mat and Eigen::Matrix

关键是使用Eigen的Map类型,它可以指向opencv分配的内存。

根据Eigen文档,Map应该是透明的,几乎所有在矩阵上运行的操作都应该在Map上运行。 https://eigen.tuxfamily.org/dox/group__TutorialMapClass.html

以下是上述链接中的一些代码。 m2map指向名为m2的矩阵的记忆:

m2map(3) = 7;   // this will change m2, since they share the same array

但对我来说,即使是最简单的作业也会失败:

Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> eigenHeatmap(heatmap.ptr<float>(), heatmap.rows, heatmap.cols);

eigenHeatmap=0.f;

产生

/.../Code.cpp:69:25: error: no match for ‘operator=’ (operand types are ‘Eigen::Map<Eigen::Matrix<float, -1, -1, 1> >’ and ‘float’)
             eigenHeatmap=0.f;

整个错误消息很长:https://pastebin.com/i3AWs6C7

我正在使用eigen3.3.3,opencv3.2.0和g ++ 5.4.0

2 个答案:

答案 0 :(得分:3)

您应该尝试使用eigenHeatmap.setZero();eigenHeatmap.setConstant(0.f);

答案 1 :(得分:3)

替代Avi的答案,如果您正在进行大量的元素操作,请使用Array而不是Matrix,即

Eigen::Map<Eigen::Array<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> eigenHeatmap(heatmap.ptr<float>(), heatmap.rows, heatmap.cols);

eigenHeatmap=0.f;

如果您经常使用它,请首先制作一些typedef:

typedef Eigen::Array<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> ArrayXXfR;
typedef Eigen::Map<ArrayXXfR> ArrayMap;
ArrayMap eigenHeatmap(heatmap.ptr<float>(), heatmap.rows, heatmap.cols);

附录:有关Array课程的更多详情,read the corresponding tutorial here