0

PCL과 OPENCV를 사용하는 opensource C++ 프로그램을 컴파일하고 있습니다. 문제는 다른 Eigen 객체 사이의 유형 변환 인 것 같습니다.VS 2010에서 PCL을 사용할 때 YOU_MIXED_DIFFERENT_NUMERIC_TY 오류가 발생했습니다.

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

코드 프로그램의 고유치에 대한 :

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 : \ 프로그램 파일 (86) \ PCL
1.6.0 \ 3rdparty \ e 오류 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) : 함수
참조 참조 IGEN \는 \ 고유 \ SRC \ 코어 \의 matrix.h (294)를 포함 템플릿 인스턴스화
'아이겐 :: 매트릭스 < _Scalar, _Rows, _Cols> :: 매트릭스 (아이겐 :: MatrixBase &가
CONST)' 1 컴파일되는> 1> [ 1> _Scalar = 플로트와, 1> _Rows = 4, 1> _Cols = 4,,210 1> = 파생 아이겐 :: 매트릭스 1>] 1> F : \ CPPS \ win32project1 \ win32project1 \ jointpointcloud.cpp (88) 템플릿 인스턴스화
'아이겐 :: 매트릭스 < _Scalar 기능하도록
기준을 참조 _Rows, _Cols> :: 매트릭스 (CONST
아이겐 :: MatrixBase &는 ) "컴파일되는 1> 1> [ 1> = _Scalar 플로트와 1> _Rows = 4 1> _Cols = 4 1> Derived = Eigen :: Matrix 1>] ========== 빌드 : 0 성공, 1 실패, 0 최신, 0 건너 뛰기 ==========

+0

이 단계는'T = angle;'문제 일 수 있습니다. 대신에'T = (Eigen :: Isometry3d) angle;을 사용해야합니다. –

+0

어떤 라인이 실제로 문제를 일으키는 지 자세히 설명해 주시겠습니까? @TheApache에 언급 된 행은 숫자 형식 변환을 포함하지 않으므로 오류의 원인이라고 생각하지 않습니다. – chtz

+0

StackOverflow에 오신 것을 환영합니다! 문제에 대한 추가 정보를 제공해주십시오. 특히, [mcve]와 _full_ 오류 메시지를 게시하십시오. 제공된 정보를 통해 현재 문제가 무엇인지 알 수 없습니다. – mindriot

답변

0

PCL1.6의 transformPointCloud 메서드는 변환 행렬이 부동 형식 (link)이어야합니다. 당신은 .matrix() 전환이 실제로 필요하지 않습니다

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

작성해야합니다.

+0

그것은 그 오류를 완벽하게 해결합니다. 고마워, 츠쯔. – user18441