00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 #ifdef __LINUX__
00055         #include "cob_vision_utils/CameraSensorToolbox.h"
00056 
00057         #include "cob_vision_utils/VisionUtils.h"
00058         #include "tinyxml.h"
00059 #else
00060         #include "cob_perception_common/cob_vision_utils/common/include/cob_vision_utils/CameraSensorToolbox.h"
00061 
00062         #include "cob_perception_common/cob_vision_utils/common/include/cob_vision_utils/VisionUtils.h"
00063         #include "cob_object_perception_intern/windows/src/extern/TinyXml/tinyxml.h"
00064 #endif
00065 
00066 using namespace ipa_CameraSensors;
00067 
00068 __DLL_LIBCAMERASENSORS__ CameraSensorToolboxPtr ipa_CameraSensors::CreateCameraSensorToolbox()
00069 {
00070         return CameraSensorToolboxPtr(new CameraSensorToolbox());
00071 }
00072 
00073 CameraSensorToolbox::CameraSensorToolbox()
00074 {
00075         m_Initialized = false;
00076 }
00077 
00078 CameraSensorToolbox::~CameraSensorToolbox()
00079 {
00080         Release();
00081 }
00082 
00083 unsigned long CameraSensorToolbox::Release()
00084 {
00085         std::map<std::string, CvMat*>::iterator matrixIterator;
00086         std::map<std::string, IplImage*>::iterator iplImageIterator;
00087 
00088         m_intrinsicMatrices.clear();
00089         m_distortionCoeffs.clear();
00090         m_undistortMapsX.clear();
00091         m_undistortMapsY.clear();
00092         m_extrinsicMatrices.clear();
00093 
00094         return RET_OK;
00095 }
00096 
00097 CameraSensorToolbox::CameraSensorToolbox(const CameraSensorToolbox& cst)
00098 {
00099         Release();
00100 
00101         std::map<std::string, cv::Mat>::const_iterator matrixIterator;
00102 
00103         
00104         for ( matrixIterator=cst.m_intrinsicMatrices.begin() ; matrixIterator != cst.m_intrinsicMatrices.end(); matrixIterator++ )
00105         {
00106                 m_intrinsicMatrices[matrixIterator->first] = matrixIterator->second.clone();
00107         }
00108 
00109         
00110         for ( matrixIterator=cst.m_distortionCoeffs.begin() ; matrixIterator != cst.m_distortionCoeffs.end(); matrixIterator++ )
00111         {
00112                 m_distortionCoeffs[matrixIterator->first] = matrixIterator->second.clone();
00113         }
00114 
00115         
00116         for ( matrixIterator=cst.m_undistortMapsX.begin() ; matrixIterator != cst.m_undistortMapsX.end(); matrixIterator++ )
00117         {
00118                 m_undistortMapsX[matrixIterator->first] = matrixIterator->second.clone();
00119         }
00120 
00121         
00122         for ( matrixIterator=cst.m_undistortMapsY.begin() ; matrixIterator != cst.m_undistortMapsY.end(); matrixIterator++ )
00123         {
00124                 m_undistortMapsY[matrixIterator->first] = matrixIterator->second.clone();
00125         }
00126 
00127         
00128         for ( matrixIterator=cst.m_extrinsicMatrices.begin() ; matrixIterator != cst.m_extrinsicMatrices.end(); matrixIterator++ )
00129         {
00130                 m_extrinsicMatrices[matrixIterator->first] = matrixIterator->second.clone();
00131         }
00132 
00133         m_Initialized = cst.m_Initialized;
00134 }
00135 
00136 CameraSensorToolbox& CameraSensorToolbox::operator=(const CameraSensorToolbox& cst)
00137 {
00138         
00139         if (this==&cst)
00140         {
00141                  return *this;
00142         }
00143 
00144         Release();
00145 
00146         std::map<std::string, cv::Mat>::const_iterator matrixIterator;
00147 
00148         
00149         for ( matrixIterator=cst.m_intrinsicMatrices.begin() ; matrixIterator != cst.m_intrinsicMatrices.end(); matrixIterator++ )
00150         {
00151                 m_intrinsicMatrices[matrixIterator->first] = matrixIterator->second.clone();
00152         }
00153 
00154         
00155         for ( matrixIterator=cst.m_distortionCoeffs.begin() ; matrixIterator != cst.m_distortionCoeffs.end(); matrixIterator++ )
00156         {
00157                 m_distortionCoeffs[matrixIterator->first] = matrixIterator->second.clone();
00158         }
00159 
00160         
00161         for ( matrixIterator=cst.m_undistortMapsX.begin() ; matrixIterator != cst.m_undistortMapsX.end(); matrixIterator++ )
00162         {
00163                 m_undistortMapsX[matrixIterator->first] = matrixIterator->second.clone();
00164         }
00165 
00166         
00167         for ( matrixIterator=cst.m_undistortMapsY.begin() ; matrixIterator != cst.m_undistortMapsY.end(); matrixIterator++ )
00168         {
00169                 m_undistortMapsY[matrixIterator->first] = matrixIterator->second.clone();
00170         }
00171 
00172         
00173         for ( matrixIterator=cst.m_extrinsicMatrices.begin() ; matrixIterator != cst.m_extrinsicMatrices.end(); matrixIterator++ )
00174         {
00175                 m_extrinsicMatrices[matrixIterator->first] = matrixIterator->second.clone();
00176         }
00177 
00178         m_Initialized = cst.m_Initialized;
00179 
00180         return *this;
00181 }
00182 
00183 unsigned long CameraSensorToolbox::Init(std::string directory, ipa_CameraSensors::t_cameraType cameraType,
00184                                                                                 int cameraIndex, const CvSize imageSize)
00185 {
00186         Release();
00187 
00188         m_ImageSize = imageSize;
00189 
00190         std::string iniFileNameAndPath = directory;
00191         iniFileNameAndPath += "cameraSensorsIni.xml";
00192         if (LoadParameters(iniFileNameAndPath.c_str(), cameraType, cameraIndex) & RET_FAILED)
00193         {
00194                 return (RET_FAILED | RET_INIT_CAMERA_FAILED);
00195         }
00196 
00197         m_Initialized = true;
00198         return RET_OK;
00199 }
00200 
00201 unsigned long CameraSensorToolbox::Init(const std::map<std::string, cv::Mat>* intrinsicMatrices,
00202                                                                                 const std::map<std::string, cv::Mat>* distortionParameters,
00203                                                                                 const std::map<std::string, cv::Mat>* extrinsicMatrices,
00204                                                                                 const std::map<std::string, cv::Mat>* undistortMapsX,
00205                                                                                 const std::map<std::string, cv::Mat>* undistortMapsY,
00206                                                                                 const CvSize imageSize)
00207 {
00208         Release();
00209 
00210         m_ImageSize = imageSize;
00211 
00212         std::map<std::string, cv::Mat>::const_iterator matrixIterator;
00213 
00214         
00215         for ( matrixIterator=m_intrinsicMatrices.begin() ; matrixIterator != m_intrinsicMatrices.end(); matrixIterator++ )
00216         {
00217                 m_intrinsicMatrices[matrixIterator->first] = matrixIterator->second.clone();
00218         }
00219 
00220         
00221         for ( matrixIterator=m_distortionCoeffs.begin() ; matrixIterator != m_distortionCoeffs.end(); matrixIterator++ )
00222         {
00223                 m_distortionCoeffs[matrixIterator->first] = matrixIterator->second.clone();
00224         }
00225 
00226         
00227         for ( matrixIterator=m_undistortMapsX.begin() ; matrixIterator != m_undistortMapsX.end(); matrixIterator++ )
00228         {
00229                 m_undistortMapsX[matrixIterator->first] = matrixIterator->second.clone();
00230         }
00231 
00232         
00233         for ( matrixIterator=m_undistortMapsY.begin() ; matrixIterator != m_undistortMapsY.end(); matrixIterator++ )
00234         {
00235                 m_undistortMapsY[matrixIterator->first] = matrixIterator->second.clone();
00236         }
00237 
00238         
00239         for ( matrixIterator=m_extrinsicMatrices.begin() ; matrixIterator != m_extrinsicMatrices.end(); matrixIterator++ )
00240         {
00241                 m_extrinsicMatrices[matrixIterator->first] = matrixIterator->second.clone();
00242         }
00243 
00244         m_Initialized = true;
00245         return RET_OK;
00246 }
00247 
00248 unsigned long CameraSensorToolbox::ConvertCameraTypeToString(ipa_CameraSensors::t_cameraType cameraType, std::string &cameraTypeString)
00249 {
00250         switch (cameraType)
00251         {
00252         case ROBOT:
00253                 cameraTypeString = "Robot";
00254                 break;
00255         case CAM_IC:
00256                 cameraTypeString = "ICCam";
00257                 break;
00258         case CAM_AVTPIKE:
00259                 cameraTypeString = "AVTPikeCam";
00260                 break;
00261         case CAM_AXIS:
00262                 cameraTypeString = "AxisCam";
00263                 break;
00264         case CAM_PROSILICA:
00265                 cameraTypeString = "Prosilica";
00266                 break;
00267         case CAM_VIRTUALCOLOR:
00268                 cameraTypeString = "VirtualColorCam";
00269                 break;
00270         case CAM_SWISSRANGER:
00271                 cameraTypeString = "Swissranger";
00272                 break;
00273         case CAM_PMDCAM:
00274                 cameraTypeString = "PMDCam";
00275                 break;
00276         case CAM_KINECT:
00277                 cameraTypeString = "Kinect";
00278                 break;
00279         case CAM_OPENCVCAMERA:
00280                 cameraTypeString = "OpenCVCamera";
00281                 break;
00282         case CAM_VIRTUALRANGE:
00283                 cameraTypeString = "VirtualRangeCam";
00284                 break;
00285         default:
00286                 std::cerr << "ERROR - CameraSensorToolbox::ConvertCameraTypeToString:" << std::endl;
00287                 std::cerr << "\t ... Camera type " << cameraType << " unspecified." << std::endl;
00288                 return RET_FAILED;
00289         }
00290 
00291         return RET_OK;
00292 }
00293 
00294 cv::Mat CameraSensorToolbox::GetExtrinsicParameters(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex)
00295 {
00296         std::stringstream ss;
00297         std::string extrinsicMapName = "";
00298 
00299         ConvertCameraTypeToString(cameraType, extrinsicMapName);
00300         ss << extrinsicMapName << "_" << cameraIndex;
00301 
00302         if (m_extrinsicMatrices.find(ss.str()) == m_extrinsicMatrices.end())
00303         {
00304                 std::cout << "ERROR - CameraSensorToolbox::GetExtrinsicParameters:" << std::endl;
00305                 std::cout << "\t ... Extrinsic matrix to '" << ss.str() << "' not specified\n";
00306                 return cv::Mat();
00307         }
00308         else
00309         {
00310                 return m_extrinsicMatrices[ss.str()];
00311         }
00312 }
00313 
00314 unsigned long CameraSensorToolbox::SetExtrinsicParameters(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex,
00315                                                                                                                   const cv::Mat& _rotation, const cv::Mat& _translation)
00316 {
00317         std::stringstream ss;
00318         std::string extrinsicMapName = "";
00319 
00320         ConvertCameraTypeToString(cameraType, extrinsicMapName);
00321         ss << extrinsicMapName << "_" << cameraIndex;
00322 
00323         return SetExtrinsicParameters(ss.str(), _rotation, _translation);
00324 }
00325 
00326 unsigned long CameraSensorToolbox::SetExtrinsicParameters(std::string key,
00327                                                                                                                   const cv::Mat& _rotation, const cv::Mat& _translation)
00328 {
00329         CV_Assert( _rotation.rows == 3 && _rotation.cols == 3 && _rotation.depth() == CV_64FC(1));
00330         CV_Assert( _translation.rows == 3 && _translation.cols == 1 && _translation.depth() == CV_64FC(1));
00331 
00332         std::map<std::string, cv::Mat>::iterator iterator;
00333         iterator = m_extrinsicMatrices.find(key);
00334         if (iterator != m_extrinsicMatrices.end())
00335         {
00336                 m_extrinsicMatrices.erase(iterator);
00337         }
00338 
00339         cv::Mat extrinsicMatrix(3, 4, CV_64FC(1), cv::Scalar(0));
00340 
00341         extrinsicMatrix.at<double>(0, 0) = _rotation.at<double>(0, 0);
00342         extrinsicMatrix.at<double>(0, 1) = _rotation.at<double>(0, 1);
00343         extrinsicMatrix.at<double>(0, 2) = _rotation.at<double>(0, 2);
00344         extrinsicMatrix.at<double>(1, 0) = _rotation.at<double>(1, 0);
00345         extrinsicMatrix.at<double>(1, 1) = _rotation.at<double>(1, 1);
00346         extrinsicMatrix.at<double>(1, 2) = _rotation.at<double>(1, 2);
00347         extrinsicMatrix.at<double>(2, 0) = _rotation.at<double>(2, 0);
00348         extrinsicMatrix.at<double>(2, 1) = _rotation.at<double>(2, 1);
00349         extrinsicMatrix.at<double>(2, 2) = _rotation.at<double>(2, 2);
00350 
00351         extrinsicMatrix.at<double>(0, 3) = _translation.at<double>(0, 0);
00352         extrinsicMatrix.at<double>(1, 3) = _translation.at<double>(1, 0);
00353         extrinsicMatrix.at<double>(2, 3) = _translation.at<double>(2, 0);
00354 
00355         m_extrinsicMatrices[key] = extrinsicMatrix;
00356 
00357         return RET_OK;
00358 }
00359 
00360 cv::Mat CameraSensorToolbox::GetIntrinsicMatrix(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex)
00361 {
00362         std::stringstream ss;
00363         std::string intrinsicMapName = "";
00364 
00365         ConvertCameraTypeToString(cameraType, intrinsicMapName);
00366         ss << intrinsicMapName << "_" << cameraIndex;
00367 
00368         if (m_intrinsicMatrices.find(ss.str()) == m_intrinsicMatrices.end())
00369         {
00370                 std::cout << "ERROR - CameraSensorToolbox::GetIntrinsicMatrix:" << std::endl;
00371                 std::cout << "\t ... Intrinsic matrix related to '" << ss.str() << "' not specified\n";
00372                 return cv::Mat();
00373         }
00374         else
00375         {
00376                 return m_intrinsicMatrices[ss.str()];
00377         }
00378 }
00379 
00380 unsigned long CameraSensorToolbox::SetIntrinsicParameters(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex,
00381                                                                                                                   const cv::Mat& _intrinsicMatrix, const cv::Mat& _distortionCoeffs)
00382 {
00383         std::stringstream ss;
00384         std::string intrinsicMapName = "";
00385 
00386         ConvertCameraTypeToString(cameraType, intrinsicMapName);
00387         ss << intrinsicMapName << "_" << cameraIndex;
00388 
00389         return SetIntrinsicParameters(ss.str(), _intrinsicMatrix, _distortionCoeffs);
00390 }
00391 
00392 unsigned long CameraSensorToolbox::SetIntrinsicParameters(std::string key,
00393                                                                                                                   const cv::Mat& _intrinsicMatrix, const cv::Mat& _distortionCoeffs)
00394 {
00395         CV_Assert( _intrinsicMatrix.rows == 4 && _intrinsicMatrix.cols == 1 && _intrinsicMatrix.depth() == CV_64FC(1));
00396         CV_Assert( _distortionCoeffs.rows == 4 && _distortionCoeffs.cols == 1 && _distortionCoeffs.depth() == CV_64FC(1));
00397 
00398         std::map<std::string, cv::Mat>::iterator matrixIterator;
00399 
00400         
00401         
00402         matrixIterator = m_intrinsicMatrices.find(key);
00403         if (matrixIterator != m_intrinsicMatrices.end())
00404         {
00405                 m_intrinsicMatrices.erase(matrixIterator);
00406         }
00407 
00408         cv::Mat intrinsicMatrix (3, 3, CV_64FC(1), cv::Scalar(0) );
00409 
00410         intrinsicMatrix.at<double>(0, 0) = _intrinsicMatrix.at<double>(0, 0);
00411         intrinsicMatrix.at<double>(1, 1) = _intrinsicMatrix.at<double>(1, 0);
00412         intrinsicMatrix.at<double>(0, 2) = _intrinsicMatrix.at<double>(2, 0);
00413         intrinsicMatrix.at<double>(1, 2) = _intrinsicMatrix.at<double>(3, 0);
00414         intrinsicMatrix.at<double>(2, 2) = 1.f;
00415 
00416         m_intrinsicMatrices[key] = intrinsicMatrix;
00417 
00418         
00419         matrixIterator = m_distortionCoeffs.find(key);
00420         if (matrixIterator != m_distortionCoeffs.end())
00421         {
00422                 m_distortionCoeffs.erase(matrixIterator);
00423         }
00424 
00425         cv::Mat distortionCoeffs(1, 4, CV_64FC(1), cv::Scalar(0) );
00426 
00427         distortionCoeffs.at<double>(0, 0) = _distortionCoeffs.at<double>(0, 0);
00428         distortionCoeffs.at<double>(0, 1) = _distortionCoeffs.at<double>(1, 0);
00429         distortionCoeffs.at<double>(0, 2) = _distortionCoeffs.at<double>(2, 0);
00430         distortionCoeffs.at<double>(0, 3) = _distortionCoeffs.at<double>(3, 0);
00431 
00432         m_distortionCoeffs[key] = distortionCoeffs;
00433 
00434         
00435         matrixIterator = m_undistortMapsX.find(key);
00436         if (matrixIterator != m_undistortMapsX.end())
00437         {
00438                 m_undistortMapsX.erase(matrixIterator);
00439         }
00440 
00441         cv::Mat undistortMapX(m_ImageSize.height, m_ImageSize.width, CV_32FC(1));
00442 
00443         matrixIterator = m_undistortMapsY.find(key);
00444         if (matrixIterator != m_undistortMapsY.end())
00445         {
00446                 m_undistortMapsY.erase(matrixIterator);
00447         }
00448  
00449         cv::Mat undistortMapY(m_ImageSize.height, m_ImageSize.width, CV_32FC(1));
00450 
00451         ipa_Utils::InitUndistortMap(intrinsicMatrix, distortionCoeffs, undistortMapX, undistortMapY);
00452 
00453         m_undistortMapsX[key] = undistortMapX;
00454         m_undistortMapsY[key] = undistortMapY;
00455 
00456         return RET_OK;
00457 }
00458 
00459 cv::Mat CameraSensorToolbox::GetDistortionParameters(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex)
00460 {
00461         std::stringstream ss;
00462         std::string distortionMapName = "";
00463 
00464         ConvertCameraTypeToString(cameraType, distortionMapName);
00465         ss << distortionMapName << "_" << cameraIndex;
00466 
00467         if (m_distortionCoeffs.find(ss.str()) == m_distortionCoeffs.end())
00468         {
00469                 std::cout << "ERROR - CameraSensorToolbox::GetDistortionParameters:" << std::endl;
00470                 std::cout << "\t ... Distortion parameters related to '" << ss.str() << "' not specified\n";
00471                 return cv::Mat();
00472         }
00473         else
00474         {
00475                 return m_distortionCoeffs[ss.str()];
00476         }
00477 }
00478 
00479 cv::Mat CameraSensorToolbox::GetDistortionMapX(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex)
00480 {
00481         std::stringstream ss;
00482         std::string distortionMapName = "";
00483 
00484         ConvertCameraTypeToString(cameraType, distortionMapName);
00485         ss << distortionMapName << "_" << cameraIndex;
00486 
00487         if (m_undistortMapsX.find(ss.str()) == m_undistortMapsX.end())
00488         {
00489                 std::cout << "ERROR - CameraSensorToolbox::GetDistortionMapX:" << std::endl;
00490                 std::cout << "\t ... Undistortion map X related to '" << ss.str() << "' not specified\n";
00491                 return cv::Mat();
00492         }
00493         else
00494         {
00495                 return m_undistortMapsX[ss.str()];
00496         }
00497 }
00498 
00499 cv::Mat CameraSensorToolbox::GetDistortionMapY(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex)
00500 {
00501         std::stringstream ss;
00502         std::string distortionMapName = "";
00503 
00504         ConvertCameraTypeToString(cameraType, distortionMapName);
00505         ss << distortionMapName << "_" << cameraIndex;
00506 
00507         if (m_undistortMapsY.find(ss.str()) == m_undistortMapsY.end())
00508         {
00509                 std::cout << "ERROR - CameraSensorToolbox::GetDistortionMapY:" << std::endl;
00510                 std::cout << "\t ... Undistortion map Y related to '" << ss.str() << "' not specified\n";
00511                 return cv::Mat();
00512         }
00513         else
00514         {
00515                 return m_undistortMapsY[ss.str()];
00516         }
00517 }
00518 
00519 unsigned long CameraSensorToolbox::RemoveDistortion(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex, const cv::Mat& src, cv::Mat& dst)
00520 {
00521         std::stringstream ss;
00522         std::string distortionMapName = "";
00523 
00524         ConvertCameraTypeToString(cameraType, distortionMapName);
00525         ss << distortionMapName << "_" << cameraIndex;
00526 
00527         if (m_undistortMapsX.find(ss.str()) == m_undistortMapsX.end() ||
00528                 m_undistortMapsY.find(ss.str()) == m_undistortMapsY.end())
00529         {
00530                 std::cout << "ERROR - CameraSensorToolbox::RemoveDistortion:" << std::endl;
00531                 std::cout << "\t ... Undistortion map Y related to '" << ss.str() << "' not specified\n";
00532                 return RET_FAILED;
00533         }
00534         else
00535         {
00536                 CV_Assert(src.rows == m_undistortMapsX[ss.str()].rows && src.cols == m_undistortMapsX[ss.str()].cols);
00537 
00538                 cv::remap(src, dst, m_undistortMapsX[ss.str()], m_undistortMapsY[ss.str()], cv::INTER_LINEAR);
00539                 return RET_OK;
00540         }
00541 
00542         return (RET_FAILED | RET_MISSING_INTRINSIC_DISTORTION_PARAMS);
00543 }
00544 
00545 unsigned long CameraSensorToolbox::ReprojectXYZ(ipa_CameraSensors::t_cameraType cameraType, int cameraIndex, double x, double y, double z, int& u, int& v)
00546 {
00547         std::stringstream ss;
00548         std::string distortionMapName = "";
00549 
00550         ConvertCameraTypeToString(cameraType, distortionMapName);
00551         ss << distortionMapName << "_" << cameraIndex;
00552 
00553         if (m_intrinsicMatrices.find(ss.str()) == m_intrinsicMatrices.end())
00554         {
00555                 std::cout << "ERROR - CameraSensorToolbox::ReprojectXYZ:" << std::endl;
00556                 std::cout << "\t ... Intrinsic matrix related to '" << ss.str() << "' not specified\n";
00557                 return RET_FAILED;
00558         }
00559 
00560         cv::Mat UV1 (3, 1, CV_64FC(1), cv::Scalar(0));
00561         cv::Mat XYZ (3, 1, CV_64FC(1), cv::Scalar(0));
00562 
00563         x *= 1000;
00564         y *= 1000;
00565         z *= 1000;
00566 
00567         x = x/z;
00568         y = y/z;
00569         z = 1;
00570 
00571         XYZ.at<double>(0, 0) = x;
00572         XYZ.at<double>(1, 0) = y;
00573         XYZ.at<double>(2, 0) = z;
00574 
00575         
00576         if (z == 0)
00577         {
00578                 std::cerr << "ERROR - CameraSensorToolbox::ReprojectXYZ" << std::endl;
00579                 std::cerr << "\t ... z value is 0.\n";
00580                 return RET_FAILED;
00581         }
00582 
00583         UV1 = m_intrinsicMatrices[ss.str()] * XYZ;
00584 
00585         u = cvRound(UV1.at<double>(0, 0));
00586         v = cvRound(UV1.at<double>(1, 0));
00587 
00588         return RET_OK;
00589 }
00590 
00591 
00592 unsigned long CameraSensorToolbox::LoadParameters(const char* filename, ipa_CameraSensors::t_cameraType cameraType, int cameraIndex)
00593 {
00594         std::stringstream ss;
00595         std::string xmlTagName = "";
00596 
00597         ConvertCameraTypeToString(cameraType, xmlTagName);
00598         ss << xmlTagName << "_" << cameraIndex;
00599 
00600         boost::shared_ptr<TiXmlDocument> p_configXmlDocument (new TiXmlDocument( filename ));
00601         if (!p_configXmlDocument->LoadFile())
00602         {
00603                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00604                 std::cerr << "\t ...  Error while loading xml configuration file (Check filename and syntax of the file):\n" << filename << std::endl;
00605                 return (RET_FAILED | RET_FAILED_OPEN_FILE);
00606         }
00607         std::cout << "INFO - CameraSensorsToolbox::LoadParameters:" << std::endl;
00608         std::cout << "\t ...  Parsing xml configuration file:" << std::endl;
00609         std::cout << "\t ... '" << filename << "'" << std::endl;
00610 
00611         if ( p_configXmlDocument )
00612         {
00613 
00614 
00615 
00616 
00617                 
00618                 TiXmlElement *p_xmlElement_Root = NULL;
00619                 p_xmlElement_Root = p_configXmlDocument->FirstChildElement( "LibCameraSensors" );
00620                 if ( p_xmlElement_Root )
00621                 {
00622 
00623 
00624 
00625 
00626                         TiXmlElement *p_xmlElement_Root_Cam = NULL;
00627                         p_xmlElement_Root_Cam = p_xmlElement_Root->FirstChildElement( ss.str() );
00628                         if ( p_xmlElement_Root_Cam )
00629                         {
00630 
00631 
00632 
00633 
00634                                 TiXmlElement *p_xmlElement_Child = NULL;
00635                                 p_xmlElement_Child = p_xmlElement_Root_Cam->FirstChildElement( "IntrinsicParameters" );
00636                                 if ( p_xmlElement_Child )
00637                                 {
00638                                         TiXmlElement *p_xmlElement_Intrinsics = 0;
00639                                         TiXmlElement *p_xmlElement_Intrinsics_Child = 0;
00640                                         
00641                                         for( p_xmlElement_Intrinsics = p_xmlElement_Child->FirstChildElement();
00642                                                 p_xmlElement_Intrinsics;
00643                                                 p_xmlElement_Intrinsics = p_xmlElement_Intrinsics->NextSiblingElement())
00644                                         {
00645 
00646 
00647 
00648                                                 
00649                                                 cv::Mat intrinsicMatrix (4, 1, CV_64FC(1));
00650                                                 p_xmlElement_Intrinsics_Child = NULL;
00651                                                 p_xmlElement_Intrinsics_Child = p_xmlElement_Intrinsics->FirstChildElement( "IntrinsicMatrix" );
00652 
00653                                                 if ( p_xmlElement_Intrinsics_Child )
00654                                                 {
00655                                                         double fx, fy, cx, cy;
00656                                                         
00657                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "fx", &fx ) != TIXML_SUCCESS)
00658                                                         {
00659                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00660                                                                 std::cerr << "\t ...  Can't find attribute 'fx' of tag 'IntrinsicMatrix'." << std::endl;
00661                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00662                                                         }
00663                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "fy", &fy ) != TIXML_SUCCESS)
00664                                                         {
00665                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00666                                                                 std::cerr << "\t ...  Can't find attribute 'fy' of tag 'IntrinsicMatrix'." << std::endl;
00667                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00668                                                         }
00669                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "cx", &cx ) != TIXML_SUCCESS)
00670                                                         {
00671                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00672                                                                 std::cerr << "\t ...  Can't find attribute 'cx' of tag 'IntrinsicMatrix'." << std::endl;
00673                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00674                                                         }
00675                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "cy", &cy ) != TIXML_SUCCESS)
00676                                                         {
00677                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00678                                                                 std::cerr << "\t ...  Can't find attribute 'cy' of tag 'IntrinsicMatrix'." << std::endl;
00679                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00680                                                         }
00681 
00682 
00683                                                         intrinsicMatrix.at<double>(0, 0) = fx;
00684                                                         intrinsicMatrix.at<double>(1, 0) = fy;
00685                                                         intrinsicMatrix.at<double>(2, 0) = cx;
00686                                                         intrinsicMatrix.at<double>(3, 0) = cy;
00687                                                 }
00688                                                 else
00689                                                 {
00690                                                         std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00691                                                         std::cerr << "\t ...  Can't find tag 'IntrinsicMatrix'." << std::endl;
00692                                                         return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00693                                                 }
00694 
00695 
00696 
00697 
00698                                                 cv::Mat distortionCoeffs (4, 1, CV_64FC(1));
00699                                                 p_xmlElement_Intrinsics_Child = NULL;
00700                                                 p_xmlElement_Intrinsics_Child = p_xmlElement_Intrinsics->FirstChildElement( "DistortionCoeffs" );
00701 
00702                                                 if ( p_xmlElement_Child )
00703                                                 {
00704                                                         double k1, k2, p1, p2;
00705                                                         
00706                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "k1", &k1 ) != TIXML_SUCCESS)
00707                                                         {
00708                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00709                                                                 std::cerr << "\t ...  Can't find attribute 'k1' of tag 'DistortionCoeffs '." << std::endl;
00710                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00711                                                         }
00712                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "k2", &k2 ) != TIXML_SUCCESS)
00713                                                         {
00714                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00715                                                                 std::cerr << "\t ...  Can't find attribute 'k2' of tag 'DistortionCoeffs '." << std::endl;
00716                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00717                                                         }
00718                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "p1", &p1 ) != TIXML_SUCCESS)
00719                                                         {
00720                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00721                                                                 std::cerr << "\t ...  Can't find attribute 'p1' of tag 'DistortionCoeffs '." << std::endl;
00722                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00723                                                         }
00724                                                         if ( p_xmlElement_Intrinsics_Child->QueryValueAttribute( "p2", &p2 ) != TIXML_SUCCESS)
00725                                                         {
00726                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00727                                                                 std::cerr << "\t ...  Can't find attribute 'p2' of tag 'DistortionCoeffs '." << std::endl;
00728                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00729                                                         }
00730 
00731                                                         distortionCoeffs.at<double>(0, 0) = k1;
00732                                                         distortionCoeffs.at<double>(1, 0) = k2;
00733                                                         distortionCoeffs.at<double>(2, 0) = p1;
00734                                                         distortionCoeffs.at<double>(3, 0) = p2;
00735                                                 }
00736                                                 else
00737                                                 {
00738                                                         std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00739                                                         std::cerr << "\t ...  Can't find tag 'DistortionCoeffs '." << std::endl;
00740                                                         return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00741                                                 }
00742 
00743                                                 SetIntrinsicParameters(p_xmlElement_Intrinsics->Value(), intrinsicMatrix, distortionCoeffs);
00744                                         } 
00745                                 }
00746                                 else
00747                                 {
00748                                         std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00749                                         std::cerr << "\t ... Can't find tag 'IntrinsicParameters'." << std::endl;
00750                                         return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00751                                 }
00752 
00753 
00754 
00755 
00756                                 
00757                                 p_xmlElement_Child = NULL;
00758                                 p_xmlElement_Child = p_xmlElement_Root_Cam->FirstChildElement( "ExtrinsicParameters" );
00759                                 if ( p_xmlElement_Child )
00760                                 {
00761                                         TiXmlElement *p_xmlElement_Extrinsics = 0;
00762                                         TiXmlElement *p_xmlElement_Extrinsics_Child = 0;
00763                                         
00764                                         for( p_xmlElement_Extrinsics = p_xmlElement_Child->FirstChildElement();
00765                                                 p_xmlElement_Extrinsics;
00766                                                 p_xmlElement_Extrinsics = p_xmlElement_Extrinsics->NextSiblingElement())
00767                                         {
00768 
00769 
00770 
00771 
00772                                                 
00773                                                 cv::Mat extrinsicTranslation (3, 1, CV_64FC(1));
00774                                                 p_xmlElement_Extrinsics_Child = NULL;
00775                                                 p_xmlElement_Extrinsics_Child = p_xmlElement_Extrinsics->FirstChildElement( "Translation" );
00776                                                 if ( p_xmlElement_Extrinsics_Child )
00777                                                 {
00778                                                         double x, y, z;
00779                                                         
00780                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x", &x ) != TIXML_SUCCESS)
00781                                                         {
00782                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00783                                                                 std::cerr << "\t ...  Can't find attribute 'x' of tag 'Translation'." << std::endl;
00784                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00785                                                         }
00786                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "y", &y ) != TIXML_SUCCESS)
00787                                                         {
00788                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00789                                                                 std::cerr << "\t ...  Can't find attribute 'y' of tag 'Translation'." << std::endl;
00790                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00791                                                         }
00792                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "z", &z ) != TIXML_SUCCESS)
00793                                                         {
00794                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00795                                                                 std::cerr << "\t ...  Can't find attribute 'z' of tag 'Translation'." << std::endl;
00796                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00797                                                         }
00798                                                         extrinsicTranslation.at<double>(0, 0) = x;
00799                                                         extrinsicTranslation.at<double>(1, 0) = y;
00800                                                         extrinsicTranslation.at<double>(2, 0) = z;
00801                                                 }
00802                                                 else
00803                                                 {
00804                                                         std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00805                                                         std::cerr << "\t ...  Can't find tag 'Translation'." << std::endl;
00806                                                         return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00807                                                 }
00808 
00809 
00810 
00811 
00812                                                 
00813                                                 cv::Mat extrinsicRotation (3, 3, CV_64FC(1));
00814                                                 p_xmlElement_Extrinsics_Child = NULL;
00815                                                 p_xmlElement_Extrinsics_Child = p_xmlElement_Extrinsics->FirstChildElement( "Rotation" );
00816                                                 if ( p_xmlElement_Extrinsics_Child )
00817                                                 {
00818                                                         double x11, x12, x13;
00819                                                         double x21, x22, x23;
00820                                                         double x31, x32, x33;
00821                                                         
00822                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x11", &x11 ) != TIXML_SUCCESS)
00823                                                         {
00824                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:R" << std::endl;
00825                                                                 std::cerr << "\t ...  Can't find attribute 'x11' of tag 'Rotation'." << std::endl;
00826                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00827                                                         }
00828                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x12", &x12 ) != TIXML_SUCCESS)
00829                                                         {
00830                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00831                                                                 std::cerr << "\t ...  Can't find attribute 'x12' of tag 'Rotation'." << std::endl;
00832                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00833                                                         }
00834                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x13", &x13 ) != TIXML_SUCCESS)
00835                                                         {
00836                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00837                                                                 std::cerr << "\t ...  Can't find attribute 'x13' of tag 'Rotation'." << std::endl;
00838                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00839                                                         }
00840                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x21", &x21 ) != TIXML_SUCCESS)
00841                                                         {
00842                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00843                                                                 std::cerr << "\t ...  Can't find attribute 'x21' of tag 'Rotation'." << std::endl;
00844                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00845                                                         }
00846                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x22", &x22 ) != TIXML_SUCCESS)
00847                                                         {
00848                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00849                                                                 std::cerr << "\t ...  Can't find attribute 'x22' of tag 'Rotation'." << std::endl;
00850                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00851                                                         }
00852                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x23", &x23 ) != TIXML_SUCCESS)
00853                                                         {
00854                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00855                                                                 std::cerr << "\t ...  Can't find attribute 'x23' of tag 'Rotation'." << std::endl;
00856                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00857                                                         }
00858                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x31", &x31 ) != TIXML_SUCCESS)
00859                                                         {
00860                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00861                                                                 std::cerr << "\t ...  Can't find attribute 'x31' of tag 'Rotation'." << std::endl;
00862                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00863                                                         }
00864                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x32", &x32 ) != TIXML_SUCCESS)
00865                                                         {
00866                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00867                                                                 std::cerr << "\t ...  Can't find attribute 'x32' of tag 'Rotation'." << std::endl;
00868                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00869                                                         }
00870                                                         if ( p_xmlElement_Extrinsics_Child->QueryValueAttribute( "x33", &x33 ) != TIXML_SUCCESS)
00871                                                         {
00872                                                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00873                                                                 std::cerr << "\t ...  Can't find attribute 'x33' of tag 'Rotation'." << std::endl;
00874                                                                 return (RET_FAILED | RET_XML_ATTR_NOT_FOUND);
00875                                                         }
00876 
00877                                                         extrinsicRotation.at<double>(0, 0) = x11;
00878                                                         extrinsicRotation.at<double>(0, 1) = x12;
00879                                                         extrinsicRotation.at<double>(0, 2) = x13;
00880                                                         extrinsicRotation.at<double>(1, 0) = x21;
00881                                                         extrinsicRotation.at<double>(1, 1) = x22;
00882                                                         extrinsicRotation.at<double>(1, 2) = x23;
00883                                                         extrinsicRotation.at<double>(2, 0) = x31;
00884                                                         extrinsicRotation.at<double>(2, 1) = x32;
00885                                                         extrinsicRotation.at<double>(2, 2) = x33;
00886                                                 }
00887                                                 else
00888                                                 {
00889                                                         std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00890                                                         std::cerr << "\t ...  Can't find tag 'Rotation'." << std::endl;
00891                                                         return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00892                                                 }
00893 
00894                                                 SetExtrinsicParameters(p_xmlElement_Extrinsics->Value(), extrinsicRotation, extrinsicTranslation);
00895                                         } 
00896                                 }
00897                                 else
00898                                 {
00899                                         std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00900                                         std::cerr << "\t ... Can't find tag 'ExtrinsicParameters'." << std::endl;
00901                                         return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00902                                 }
00903                         }
00904 
00905 
00906 
00907 
00908                         else
00909                         {
00910                                 std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00911                                 std::cerr << "\t ... Can't find tag '" << ss.str() << "'" << std::endl;
00912                                 return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00913                         }
00914                 }
00915 
00916 
00917 
00918 
00919                 else
00920                 {
00921                         std::cerr << "ERROR - CameraSensorsToolbox::LoadParameters:" << std::endl;
00922                         std::cerr << "\t ...  Can't find tag 'LibCameraSensors'." << std::endl;
00923                         return (RET_FAILED | RET_XML_TAG_NOT_FOUND);
00924                 }
00925         }
00926 
00927         return RET_OK;
00928 }