如何从opencv cv::Mat或行主数组初始化特征矩阵
how to initialize a Eigen Matrix from an opencv cv::Mat, or from an array which is row-major?
我发现Eigen的矩阵是默认的列主,就像MATLAB一样,但是如何从cv::Mat初始化Eigen::MatrixXd?以下代码是我的测试。但是它们都无法成功编译。有人可以给我一些建议吗?还是其他一些链接?谢谢。
cv::Mat A_M=cv::Mat(rows, cols, CV_64FC1);
double *A=(double *)A_M.data();
typedef Map<MatrixXd> MapMat;
MapMat A_eigen(A,m,n);
Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> A_eigen;
Eigen::Map<Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> >(A,m,n) = A_eigen;
更新:
double *A=(double *)A_M.data();//m*n
double *B=(double *)B_M.data();//n*p
double *C=(double *)C_M.data();//m*p
//regular Eigen Matrix
Eigen::MatrixXd A_eigenMat;
Eigen::MatrixXd B_eigenMat;
Eigen::MatrixXd C_eigenMat;
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > A_mappedMat (A, m, n);
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > B_mappedMat (B, n, p);
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > C_mappedMat (C, m, p);
// Eigen handles the conversion from row major to column major
A_eigenMat = A_mappedMat;
B_eigenMat = B_mappedMat;
C_eigenMat = C_mappedMat;
// multiplication
C_eigenMat=A_eigenMat*B_eigenMat;
然后,当我输出M_C时,它的结果是错误的。似乎C_eigenMat没有将数据复制到M_C.data中。
OpenCV 和 Eigen 之间的转换示例:
cv::Mat_<float> a = Mat_<float>::ones(2,2);
Eigen::Matrix<float,Dynamic,Dynamic> b;
cv2eigen(a,b);
SO已经回答了:
//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() );
并在另一个 SO 帖子中
MikroDel的答案使用了OpenCV的功能,但cv2eigen包含了数据的副本,如果你只想映射数据指针,这不是最佳的。使用Eigen::Map<>
通常是更好的选择。我修改了你的代码,这个例子有效:
int main(int argc, char *argv[]) {
int rows = 4, cols = 3;
cv::Mat A_M=cv::Mat::eye(rows, cols, CV_64FC1);
A_M.at<double>(0,2) = 10;
double *A=(double *)A_M.data;
//regular Eigen Matrix
Eigen::MatrixXd eigenMat;
Eigen::Map<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> > mappedMat (A,rows, cols);
// Eigen handles the conversion from row major to column major
eigenMat = mappedMat;
std::cout << A_M << std::endl;
std::cout << eigenMat << std::endl;
return 0;
}
相关文章:
- C++使用整数的压缩数组初始化对象
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 运行时C++数组初始化问题
- 使用带有参数包的数组的成员数组初始化类
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- C++ 2 个指针数组初始化 C2440
- C++结构字符数组初始化
- C++中的多维数组初始化
- constexpr数组初始化
- C++引物动态数组初始化程序的数目超过大小
- 使用std::index_sequence对std::数组初始化进行包扩展
- 当 std 数组初始化太小时,C++会引发错误吗?
- 如何确定结构数组初始化的大小?
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 此代码中的数组初始化样式是什么?这是标准的吗?
- C++ 使用数组初始化时的 STL 向量内存管理