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)。所以,第一种方式效率会更高。
我正在映射多通道 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)。所以,第一种方式效率会更高。