cv::split 或 Eigen::Stride:将多通道矩阵从 OpenCV 映射到 Eigen 结构时哪个更有效

cv::split or Eigen::Stride: Which is more efficient for mapping multi-channel matrices from OpenCV to Eigen structures

我正在映射多通道 OpenCV cv::Mat to a Eigen::Matrix。我想到了几种方法来做到这一点。为了示例忽略行优先与列优先,第一个是:

Map<Matrix<double, Dynamic, Dynamic>, Stride<3,1>> R((double*)mat_cv.data);
Map<Matrix<double, Dynamic, Dynamic>, Stride<3,1>> G((double*)mat_cv.data + 1);
Map<Matrix<double, Dynamic, Dynamic>, Stride<3,1>> B((double*)mat_cv.data + 2); 

第二种是先在OpenCV中拆分channel,然后再映射每个个体cv::Mat:

cv::Mat cv_mat;
std::vector<cv::Mat> channels;
cv::split(cv_mat, channels);
MatrixXd R = Map<Matrix<double, Dynamic, Dynamic>>((double*)channels[0].data, 10, 10);
MatrixXd G = Map<Matrix<double, Dynamic, Dynamic>>((double*)channels[1].data, 10, 10);
MatrixXd B = Map<Matrix<double, Dynamic, Dynamic>>((double*)channels[2].data, 10, 10);

哪种方法更有效?

或者,是否有我没有考虑过的完全不同的东西?

正如您所指出的,您的第一种方法是矩阵映射。您的第二个示例是 cv 矩阵的 副本 的映射(split 函数 copies)。所以,第一种方式效率会更高。