将cv::Mat之间的矩阵转换为Eigen:: matrix和

Casting matrix between cv::Mat to Eigen::Matrix and

本文关键字:转换 Eigen matrix cv Mat 之间      更新时间:2023-10-16

我有:

Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> someMatrixEigen = someMatrix();

如果我要创建一个cv::Mat头(与类型CV_8U),我应该能够做到这一点,对吗?

cv::Mat someMatrixOCV(someMatrixEigen.rows(), someMatrixEigen.cols(), CV_8U, someMatrixEigen.data());

然后,如果我有cv::Mat anotherMatrixOCV,回到Eigen,这也应该工作吗?

Eigen::Map<Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > anotherMatrixEigen(anotherMatrixOCV.ptr<int>(), anotherMatrixOCV.rows, anotherMatrixOCV.cols);

这里的整型兼容吗?当我使用float和CV_32F时,我似乎能够做到这一点,但整数版本似乎不起作用(segfault)。

CV_8U似乎是一个无符号类型(具体来说,8位,例如unsigned char),而你的矩阵是一个有符号的int类型(多少位取决于你的编译器,但超过8)。你可以尝试使用CV_32S进行转换,或Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>