0

I am compiling an opensource c++ program which uses PCL and OPENCV. The problem seems to be types transformation between different Eigen objects.

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

Code about Eigen in the program:

    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;

error message:

1>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 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 ==========

5
  • This step can be a problem T = angle;. Instead you should use T = (Eigen::Isometry3d)angle; Commented Sep 28, 2016 at 7:10
  • Could you be more specific which line actually causes the problem? The line mentioned by @TheApache does not involve numeric type conversion, so I don't think it is the reason for the error. Commented Sep 28, 2016 at 7:35
  • Welcome to StackOverflow! Please provide us more information about your problem. In particular, please post a minimal reproducible example and the full error message you are getting. From the information provided, we cannot currently tell what the problem is. Commented Sep 28, 2016 at 12:24
  • I updated the error message. Commented Oct 8, 2016 at 9:35
  • @TheApache I have updated the error message. I failed to solve it today. Commented Oct 8, 2016 at 9:39

1 Answer 1

1

The transformPointCloud methods in PCL 1.6 expect the transformation matrix to be in float format (link). You need to write

pcl::transformPointCloud( *cloud1, *output, T.cast<float>() );

The .matrix() conversion is actually not necessary.

Sign up to request clarification or add additional context in comments.

1 Comment

That is perfectly solved that error. Thank you, chtz.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.