0

Je suis la compilation d'un programme opensource C++ qui utilise PCL et OpenCV. Le problème semble être la transformation de types entre différents objets Eigen.erreur YOU_MIXED_DIFFERENT_NUMERIC_TY en utilisant PCL avec VS 2010

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 en matière de Eigen dans le programme:

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; 

message d'erreur:

1> c: \ program files (x86) \ pcl
1.6.0 \ 3ème partie \ e igen \ include \ eigen \ src \ core \ matrix.h (294): erreur 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): voir
référence à la fonction instanciation de modèle
'Eigen :: matrice < _Scalar, _Rows, _Cols> :: Matrix (const
& Eigen :: MatrixBase)' en cours de compilation 1> avec 1> [ 1> = _Scalar flotteur, 1> _Rows = 4, 1> _Cols = 4, 1> = dérivée Eigen :: Matrice 1>] 1> f: \ CPPS \ win32project1 \ win32project1 \ jointpointcloud.cpp (88): voir
référence au modèle d'instanciation fonctionner
« Eigen :: matrice < _Scalar, _Rows, _Cols> :: Matrix (const
& Eigen :: MatrixBase) » en cours de compilation 1> avec 1> [ 1> = _Scalar flotteur, 1> _Rows = 4, 1> _Cols = 4, 1> = dérivé Eigen :: Matrice 1>] ========== Corpulence: 0 réussi, 1 a échoué, 0 mise à jour, 0 sautées ==========

+0

Cette étape peut poser un problème 'T = angle;'. Au lieu de cela, vous devriez utiliser l'angle 'T = (Eigen :: Isometry3d);' –

+0

Pourriez-vous être plus précis quelle ligne cause réellement le problème? La ligne mentionnée par @TheApache n'implique pas de conversion de type numérique, donc je ne pense pas que ce soit la raison de l'erreur. – chtz

+0

Bienvenue dans StackOverflow! S'il vous plaît nous fournir plus d'informations sur votre problème. En particulier, veuillez envoyer un message [mcve] et le message d'erreur _full_ que vous obtenez. D'après les informations fournies, nous ne pouvons pas dire actuellement quel est le problème. – mindriot

Répondre

0

Les méthodes transformPointCloud de PCL 1.6 prévoient que la matrice de transformation doit être au format flottant (link). Vous devez écrire

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

La conversion .matrix() est en fait pas nécessaire.

+0

Cela est parfaitement résolu cette erreur. Merci, chtz. – user18441