2017-04-11 64 views
1

我正在使用opencv和Eigen。Eigen:給地圖賦值

這裏是如何將OpenCV的墊鏈接到的特徵矩陣樣本: OpenCV CV::Mat and Eigen::Matrix

的關鍵是使用本徵的地圖類型,它可以指向由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

我是你sing eigen3.3.3,opencv3.2.0和g ++ 5.4.0

回答

3

您應該試試eigenHeatmap.setZero();eigenHeatmap.setConstant(0.f);

3

替代阿維的答案,如果你正在做大量的元素智能操作,使用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 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