Я собираю программу c ++ с открытым исходным кодом, которая использует PCL и OPENCV. Похоже, проблема заключается в преобразовании типов между различными собственными объектами.
c:\program files (x86)\pcl 1.6.0\3rdparty\eigen\include\eigen\src\core\matrix.h(294): error C2338:
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
Код про Eigen в программе:
cv::Mat R;
cv::Rodrigues( result.rvec, R );
Eigen::Matrix3d r;
cv::cv2eigen(R, r);
// 将平移向量和旋转矩阵转换成变换矩阵
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
Eigen::AngleAxisd angle(r);
cout<<"translation"<<endl;
Eigen::Translation<double,3> trans(result.tvec.at<double>(0,0), result.tvec.at<double>(0,1), result.tvec.at<double>(0,2));
T = angle;
T(0,3) = result.tvec.at<double>(0,0);
T(1,3) = result.tvec.at<double>(0,1);
T(2,3) = result.tvec.at<double>(0,2);
// Transform point clouds
cout<<"converting image to clouds"<<endl;
PointCloud::Ptr cloud1 = image2PointCloud( frame1.rgb, frame1.depth, camera );
PointCloud::Ptr cloud2 = image2PointCloud( frame2.rgb, frame2.depth, camera );
// Combine point clouds
cout<<"combining clouds"<<endl;
PointCloud::Ptr output (new PointCloud());
pcl::transformPointCloud( *cloud1, *output, T.matrix() ); // error occurs at this line, the compiler told.
*output += *cloud2;
сообщение об ошибке:
1> c: \ program files (x86) \ pcl
1.6.0 \ 3rdparty \ eigen \ include \ eigen \ src \ core \ matrix.h (294): ошибка C2338:
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_
TO_CAST_NUMERIC_TYPES_EXPLICITLY
1> f: \ cpps \ win32project1 \ win32project1 \ jointpointcloud.cpp (88): см.
ссылка на создание шаблона функции
«Эйген :: Матрица<_Scalar, _Rows, _Cols> :: Матрица (Const
Эйген :: MatrixBase &) компилируется
1> с
1> [
1> _Scalar = float,
1> _Rows = 4,
1> _Cols = 4,
1> Производная = Eigen :: Matrix
1>] 1> f: \ cpps \ win32project1 \ win32project1 \ jointpointcloud.cpp (88): см.
ссылка на создание шаблона функции
«Эйген :: Матрица<_Scalar, _Rows, _Cols> :: Матрица (Const
Эйген :: MatrixBase &) компилируется
1> с
1> [
1> _Scalar = float,
1> _Rows = 4,
1> _Cols = 4,
1> Производная = Eigen :: Matrix
1>] ========== Построение: 0 выполнено, 1 не выполнено, 0 обновлено, 0 пропущено ===========
transformPointCloud
методы в PCL 1.6 предполагают, что матрица преобразования будет иметь формат float (ссылка на сайт).
Вам нужно написать
pcl::transformPointCloud( *cloud1, *output, T.cast<float>() );
.matrix()
конвертация на самом деле не нужна.
Других решений пока нет …