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