Pierluigi的版本並沒有完全適用於我的3頻道圖像!經過一番調查後,我結束了以下解決方案,它已爲我工作:
using namespace Eigen;
constexpr uint32_t height = 3;
constexpr uint32_t width = 7;
cv::Mat img(height, width, CV_32FC3, cv::Scalar(1.0f, 2.0f, 3.0f));
using MatrixXfRowMajor = Matrix<float, Dynamic, Dynamic, RowMajor>;
using C3Stride = Stride<Dynamic, 3>;
C3Stride c3Stride(width *3,3);
using cvMap = Map<MatrixXfRowMajor, Unaligned, C3Stride >;
cvMap imgC1(reinterpret_cast<float*>(img.data) + 0, img.rows, img.cols, c3Stride);
cvMap imgC2(reinterpret_cast<float*>(img.data) + 1, img.rows, img.cols, c3Stride);
cvMap imgC3(reinterpret_cast<float*>(img.data) + 2, img.rows, img.cols, c3Stride);
std::cout << imgC1 << std::endl << std::endl;
std::cout << imgC2 << std::endl << std::endl;
std::cout << imgC3 << std::endl << std::endl;
完美,這幾乎正是我所期待的。當使用多通道圖像(RGB,YUV或任何其他通道組合)時,您如何最好地轉換它?每個通道有單獨的矩陣?進入widthXheightXchannels的3D矩陣?或者只是擴大它的寬度(寬* 3)*高? – Yeraze 2013-02-14 15:50:10
多通道圖像通常存儲爲交錯陣列(例如RGBRGBRGB ...)。根據你想要對它們做什麼,你可能會考慮將每個單獨的通道映射到一個不同的Eigen :: Map,它利用了步長參數: 'cv :: Mat cvT(4,4,CV_32FC3); // 3通道浮點矩陣 Eigen :: Map> red(cvT.data); Eigen :: Map > green(cvT.data +1); Eigen :: Map > blue(cvT.data +2);' –
Pierluigi
2013-02-15 10:55:26
使用cvT.data()不起作用,給我一個編譯器錯誤。我發表了一個關於如何在下面做的答案,包括如何爲任意大小的矩陣和從Eigen到OpenCV的反向轉換的信息。 – Ela782 2014-02-11 16:02:24