int IcmFilter::LoadCalibratedImages(ccHObject* entities, const QString& path, const QString& imageDescFilename, const ccBBox& globalBBox) { assert(entities); //ouverture du fichier QString completeImageDescFilename = QString("%0/%1").arg(path).arg(imageDescFilename); FILE* fp = fopen(qPrintable(completeImageDescFilename), "rt"); if (fp == NULL) { ccLog::Error(QString("[IcmFilter::loadCalibratedImages] Error opening file %1!").arg(completeImageDescFilename)); return -1; } //buffers char line[MAX_ASCII_FILE_LINE_LENGTH]; #ifdef INCLUDE_PHOTOS char totalFileName[256]; #endif int loadedImages = 0; //IL FAUDRAIT ETRE PLUS SOUPLE QUE CA !!! while (fgets(line, MAX_ASCII_FILE_LINE_LENGTH , fp) != NULL) { if (line[0] == 'D' && line[1] == 'E' && line[2] == 'F') { char imageFileName[256]; sscanf(line,"DEF %s Viewpoint {",imageFileName); //add absolute path ccImage* CI = new ccImage(); QString errorStr; if (!CI->load(QString("%0/%1").arg(path).arg(imageFileName),errorStr)) { ccLog::Warning(QString("[IcmFilter] Failed to load image %1 (%2)! Process stopped...").arg(imageFileName).arg(errorStr)); delete CI; fclose(fp); return loadedImages; } ccLog::Print("[IcmFilter] Image '%s' loaded",imageFileName); CI->setEnabled(false); CI->setName(imageFileName); #ifdef INCLUDE_PHOTOS CI->setCompleteFileName(totalFileName); #endif //FOV if (!fgets(line, MAX_ASCII_FILE_LINE_LENGTH , fp)) { ccLog::Print("[IcmFilter] Read error (fieldOfView)!"); delete CI; fclose(fp); return loadedImages; } float fov_rad = 0; sscanf(line,"\t fieldOfView %f\n",&fov_rad); float fov_deg = fov_rad*static_cast<float>(CC_RAD_TO_DEG); ccLog::Print("\t FOV=%f (degrees)",fov_deg); //Position float t[3]; if (!fgets(line, MAX_ASCII_FILE_LINE_LENGTH , fp)) { ccLog::Error("[IcmFilter] Read error (position)!"); delete CI; fclose(fp); return loadedImages; } sscanf(line,"\t position %f %f %f\n",t,t+1,t+2); ccLog::Print("\t Camera pos=(%f,%f,%f)",t[0],t[1],t[2]); //Description char desc[MAX_ASCII_FILE_LINE_LENGTH]; if (!fgets(line, MAX_ASCII_FILE_LINE_LENGTH , fp)) { ccLog::Error("[IcmFilter] Read error (description)!"); delete CI; fclose(fp); return loadedImages; } sscanf(line,"\t description \"%s\"\n",desc); //CI->setDescription(desc); ccLog::Print("\t Description: '%s'",desc); //Orientation float axis[3], angle_rad; if (!fgets(line, MAX_ASCII_FILE_LINE_LENGTH , fp)) { ccLog::Error("[IcmFilter] Read error (orientation)!"); fclose(fp); return loadedImages; } sscanf(line,"\t orientation %f %f %f %f\n",axis,axis+1,axis+2,&angle_rad); ccLog::Print("\t Camera orientation=(%f,%f,%f)+[%f]",axis[0],axis[1],axis[2],angle_rad); ccCameraSensor::IntrinsicParameters params; params.vFOV_rad = fov_rad; params.arrayWidth = CI->getW(); params.arrayHeight = CI->getH(); params.principal_point[0] = params.arrayWidth / 2.0f; params.principal_point[1] = params.arrayHeight / 2.0f; params.vertFocal_pix = 1.0f; //default focal (for the 3D symbol) params.pixelSize_mm[0] = params.pixelSize_mm[1] = 1.0f; ccCameraSensor* sensor = new ccCameraSensor(params); ccGLMatrix mat; mat.initFromParameters(angle_rad,CCVector3::fromArray(axis),CCVector3::fromArray(t)); sensor->setRigidTransformation(mat); sensor->setGraphicScale(globalBBox.getDiagNorm() / 20); sensor->setVisible(true); sensor->setEnabled(false); CI->addChild(sensor); CI->setAssociatedSensor(sensor); entities->addChild(CI); ++loadedImages; } } fclose(fp); return loadedImages; }