YOU_MIXED_DIFFERENT_NUMERIC_TY 在 VS 2010 中使用 PCL 时出错
YOU_MIXED_DIFFERENT_NUMERIC_TY error in using PCL with VS 2010
我正在编译一个使用 PCL 和 OPENCV 的开源 C++ 程序。问题似乎是不同 Eigen 对象之间的类型转换。
c:\program files (x86)\pcl 1.6.0rdparty\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.0rdparty\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
1> f:\cpps\win32project1\win32project1\jointpointcloud.cpp(88) : see
reference to function template instantiation
'Eigen::Matrix<_Scalar,_Rows,_Cols>::Matrix(const
Eigen::MatrixBase &)' being compiled
1> with
1> [
1> _Scalar=float,
1> _Rows=4,
1> _Cols=4,
1> Derived=Eigen::Matrix
1> ]
1> f:\cpps\win32project1\win32project1\jointpointcloud.cpp(88) : see
reference to function template instantiation
'Eigen::Matrix<_Scalar,_Rows,_Cols>::Matrix(const
Eigen::MatrixBase &)' being compiled
1> with
1> [
1> _Scalar=float,
1> _Rows=4,
1> _Cols=4,
1> Derived=Eigen::Matrix
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
PCL 1.6 中的 transformPointCloud
方法要求转换矩阵采用浮点格式 (link)。
你需要写
pcl::transformPointCloud( *cloud1, *output, T.cast<float>() );
实际上不需要.matrix()
转换。
我正在编译一个使用 PCL 和 OPENCV 的开源 C++ 程序。问题似乎是不同 Eigen 对象之间的类型转换。
c:\program files (x86)\pcl 1.6.0rdparty\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.0rdparty\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 1> f:\cpps\win32project1\win32project1\jointpointcloud.cpp(88) : see
reference to function template instantiation
'Eigen::Matrix<_Scalar,_Rows,_Cols>::Matrix(const
Eigen::MatrixBase &)' being compiled 1> with 1> [ 1> _Scalar=float, 1> _Rows=4, 1> _Cols=4, 1> Derived=Eigen::Matrix 1> ] 1> f:\cpps\win32project1\win32project1\jointpointcloud.cpp(88) : see
reference to function template instantiation
'Eigen::Matrix<_Scalar,_Rows,_Cols>::Matrix(const
Eigen::MatrixBase &)' being compiled 1> with 1> [ 1> _Scalar=float, 1> _Rows=4, 1> _Cols=4, 1> Derived=Eigen::Matrix 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
PCL 1.6 中的 transformPointCloud
方法要求转换矩阵采用浮点格式 (link)。
你需要写
pcl::transformPointCloud( *cloud1, *output, T.cast<float>() );
实际上不需要.matrix()
转换。