OpenCV CV::Mat and Eigen::Matrix
OpenCV CV::Mat and Eigen::Matrix
是否存在将OpenCV cv::Mat
对象转换为Eigen::Matrix
的可逆方法?
例如,某种方法:
cv::Mat cvMat;
Eigen::Matrix eigMat;
camera->retrieve(cvMat);
// magic to convert cvMat to eigMat
// work on eigMat
// convert eigMat back to cvMat
imshow("Image", cvMat);
我尝试过使用cv2eigen
和eigen2cv
,但生成的cvMat
完全损坏了,我不确定为什么。尺寸是正确的,但图形完全被破坏了,所以可能是每个像素的字节数或数据大小的问题?
您也可以使用
void eigen2cv(const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, Mat& dst)
和
void cv2eigen(const Mat& src, Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst)
来自CCD_ 6。
您应该考虑使用Eigen::Map来包装OpenCV矩阵,以便Eigen SDK直接使用。这允许您在OpenCV 分配的矩阵上应用Eigen中实现的几乎所有功能
特别是,您只需实例化一个Eigen::Map,它提供指向cv::Mat缓冲区:的指针
//allocate memory for a 4x4 float matrix
cv::Mat cvT(4,4,CV_32FC1);
//directly use the buffer allocated by OpenCV
Eigen::Map<Matrix4f> eigenT( cvT.data() );
有关Eigen的更多信息::Map请查看Eigen教程:地图类
您可以在Eigen和OpenCV之间映射任意矩阵(无需复制数据)。
不过,你必须意识到两件事:
-
Eigen默认为列主存储,OpenCV存储行主存储。因此,在映射OpenCV数据时使用Eigen::RowMajor标志。
-
OpenCV矩阵必须是连续的(即ocvMatrix。isContinuous()需要为true)。如果您在创建矩阵时一次性为矩阵分配存储,则会出现这种情况(例如,如下面的示例所示,或者如果矩阵是Mat W=a.inv()等运算的结果;)
示例:
Mat A(20, 20, CV_32FC1);
cv::randn(A, 0.0f, 1.0f); // random data
// Map the OpenCV matrix with Eigen:
Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> A_Eigen(A.ptr<float>(), A.rows, A.cols);
// Do something with it in Eigen, create e.g. a new Eigen matrix:
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> B = A_Eigen.inverse();
// create an OpenCV Mat header for the Eigen data:
Mat B_OpenCV(B.rows(), B.cols(), CV_32FC1, B.data());
对于多通道矩阵(例如图像),您可以按照Pierluigi在评论中的建议使用"Stride"!
这对我有效,
#include <opencv2/core/eigen.hpp>
cv::Mat image;
image = cv::imread("/dataset/images/15207_angle_image.jpg", CV_LOA D_IMAGE_GRAYSCALE); // Read the file
Eigen::Matrix<float,Eigen::Dynamic, Eigen::Dynamic> eigen_mat;
cv::cv2eigen(image, eigen_mat);
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;
相关文章:
- Eigen如何在容器循环中干净地附加矩阵
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- Eigen - matrix.transpose 会创建矩阵的副本吗?
- C++在函数中创建的对 Eigen::Matrix 的悬空引用
- 为什么我不能从 Eigen::Matrix 继承?
- 使用 'Eigen::Matrix' 创建 'alglib::integer_1d_array'
- 是否存在与 Eigen::Matrix<>constexpr 构造函数相关的信息?
- 如何从eigen :: matrix获取内存所有权
- 如何将 Eigen Jacobi SVD 与 Eigen Affine Matrix一起使用
- Map Eigen replicate Matrix
- 如何将 Eigen::Matrix 映射到 std::vector<Eigen::vector>?
- 有一个具有映射到 std::vector 属性的 Eigen::matrix 属性的类
- 在 Eigen::Matrix 中转换 dolfin::Matrix
- 为什么"const Eigen::Matrix<>&"和"const Ref<Eigen::Matrix<> >"显然不兼容?
- 布尔乘法与 exclusive-or, not or (with Eigen Matrix Library)
- Eigen::Matrix |为什么Eigen期望int而不是size_t
- 将二维数组映射到Eigen::Matrix
- 将cv::Mat之间的矩阵转换为Eigen:: matrix和
- OpenCV CV::Mat and Eigen::Matrix
- 使用 Boost::odeint 和 Eigen::Matrix 作为状态向量