opencv矩阵转eigen_cv :: Mat转换为Eigen-Matrix和back
时间: 2024-05-07 19:21:37 浏览: 237
将OpenCV的Mat转换为Eigen的Matrix可以使用以下代码:
```
#include <opencv2/core/eigen.hpp>
#include <Eigen/Core>
#include <opencv2/opencv.hpp>
cv::Mat cv_mat;
Eigen::MatrixXf eigen_mat;
// 将cv::Mat转换为Eigen::MatrixXf
cv::cv2eigen(cv_mat, eigen_mat);
// 将Eigen::MatrixXf转换为cv::Mat
cv::Mat cv_mat2;
cv::eigen2cv(eigen_mat, cv_mat2);
```
其中,cv2eigen函数将cv::Mat转换为Eigen::MatrixXf,eigen2cv函数则将Eigen::MatrixXf转换为cv::Mat。
需要注意的是,在转换过程中需要保证Mat和Matrix的类型和大小一致,否则会出现错误。
相关问题
已知:输入图片都是640*480分辨率,出现了“OpenCV(4.6.0) Error: Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows)) in cv::debug_build_guard::_OutputArray::create, file c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\matrix_wrap.cpp, line 1219”报错
这个错误通常是因为你的代码中使用了固定大小的矩阵,而你的输入图片不符合该大小。你可以尝试使用`cv::resize`函数将输入图片的大小调整为你需要的大小,以解决这个问题。具体来说,你可以使用以下代码:
```
cv::Mat input_image = cv::imread("your_image_path");
cv::Mat resized_image;
cv::resize(input_image, resized_image, cv::Size(固定宽度, 固定高度));
```
其中,`固定宽度`和`固定高度`分别为你需要的矩阵的宽度和高度。然后,你可以将`resized_image`作为输入传递给你的函数。
写一个C++函数EigenAffine2cvRT(Eigen::Affine3d T_c_w, cv::Mat& rvec, cv::Mat& tvec),将T_c_w表示的变换转换为cv::Mat格式的旋转向量和平移向量
好的,我明白了。以下是实现该函数的代码:
```cpp
void EigenAffine2cvRT(Eigen::Affine3d T_c_w, cv::Mat& rvec, cv::Mat& tvec)
{
// 提取旋转矩阵和平移向量
Eigen::Matrix3d R_c_w = T_c_w.rotation();
Eigen::Vector3d t_c_w = T_c_w.translation();
// 将旋转矩阵转换为旋转向量
cv::Mat R_cv;
cv::eigen2cv(R_c_w, R_cv);
cv::Rodrigues(R_cv, rvec);
// 将平移向量转换为平移矩阵
cv::Mat t_cv(3, 1, CV_64F);
t_cv.at<double>(0, 0) = t_c_w(0);
t_cv.at<double>(1, 0) = t_c_w(1);
t_cv.at<double>(2, 0) = t_c_w(2);
// 将平移矩阵转换为平移向量
tvec = t_cv.clone();
}
```
该函数将Eigen库的Affine3d类型的变换矩阵转换为OpenCV的旋转向量和平移向量。首先,从变换矩阵中提取旋转矩阵和平移向量。然后,将旋转矩阵转换为旋转向量,使用OpenCV的Rodrigues函数实现。最后,将平移向量转换为OpenCV的平移向量格式。
阅读全文