cv::Mat和eigen::vector3d的转换
时间: 2023-07-31 15:05:39 浏览: 98
可以使用Eigen库提供的Map函数实现cv::Mat和Eigen::Vector3d之间的转换。具体步骤如下:
1. 将cv::Mat转换为Eigen::Map<Eigen::Matrix<double, 3, 1, Eigen::RowMajor>>对象:
```
cv::Mat mat = ...; // 3x1的列向量
Eigen::Map<Eigen::Matrix<double, 3, 1, Eigen::RowMajor>> mat_eigen(mat.ptr<double>(), mat.rows, mat.cols);
```
2. 将Eigen::Map对象转换为Eigen::Vector3d对象:
```
Eigen::Vector3d vec = mat_eigen;
```
3. 将Eigen::Vector3d对象转换为cv::Mat对象:
```
cv::Mat mat2 = (cv::Mat_<double>(3,1) << vec(0), vec(1), vec(2));
```
注意:上述代码中使用了Eigen::RowMajor,这是因为cv::Mat默认使用的是行优先存储,而Eigen默认使用的是列优先存储,因此需要指定存储顺序。
相关问题
eigen::vector3d 转换为cv::Mat的函数
可以使用以下函数将Eigen::Vector3d转换为cv::Mat:
```
cv::Mat eigen2cv(const Eigen::Vector3d& eigen_vec)
{
cv::Mat cv_vec = (cv::Mat_<double>(3, 1) << eigen_vec[0], eigen_vec[1], eigen_vec[2]);
return cv_vec;
}
```
该函数将Eigen::Vector3d类型的向量转换为3x1的cv::Mat类型的向量。
Eigen::Vector3f转换成cv::Mat
可以使用`cv::Mat`的构造函数将`Eigen::Vector3f`转换成`cv::Mat`,如下所示:
```cpp
Eigen::Vector3f vec;
// 假设已经给vec赋值
cv::Mat mat = cv::Mat(vec);
```
此时得到的`mat`是一个3行1列的单通道浮点型矩阵,每个元素分别对应`vec`中的每个分量。如果需要得到一个单行或单列的矩阵,可以使用`cv::Mat`的`reshape()`函数进行转换,如下所示:
```cpp
// 将3行1列的矩阵转换为3列1行的矩阵
cv::Mat mat_col = mat.reshape(1, 3);
// 将3行1列的矩阵转换为1行3列的矩阵
cv::Mat mat_row = mat.reshape(1, 1);
```
注意,`Eigen::Vector3f`和`cv::Mat`中的数据是按列存储的,因此在进行转换时需要注意维度的匹配。
阅读全文