std::vector<std::string> getFilesOnDirectory(const std::string& directoryPath, const std::string& extension) { try { return getFilesOnDirectory(directoryPath, std::vector<std::string>{extension}); } catch (const std::exception& e) { error(e.what(), __LINE__, __FUNCTION__, __FILE__); return {}; } }
std::vector<std::string> getTxtPathsOnDirectory(const std::string& txtDirectoryPath) { try { // Get files on directory with JSON extension const auto txtPaths = getFilesOnDirectory(txtDirectoryPath, ".txt"); // Check #files > 0 if (txtPaths.empty()) error("No txt files were found on " + txtDirectoryPath, __LINE__, __FUNCTION__, __FILE__); // Return file names return txtPaths; } catch (const std::exception& e) { error(e.what(), __LINE__, __FUNCTION__, __FILE__); return {}; } }
std::vector<std::string> getImagePathsOnDirectory(const std::string& imageDirectoryPath) { try { // Get files on directory with the desired extensions const std::vector<std::string> extensions{".bmp", ".dib", ".pbm", ".pgm", ".ppm", ".sr", ".ras", // Completely supported by OpenCV ".jpg", "jpeg", ".png"}; // Most of them supported by OpenCV const auto imagePaths = getFilesOnDirectory(imageDirectoryPath, extensions); // Check #files > 0 if (imagePaths.empty()) error("No images were found on " + imageDirectoryPath, __LINE__, __FUNCTION__, __FILE__); return imagePaths; } catch (const std::exception& e) { error(e.what(), __LINE__, __FUNCTION__, __FILE__); return {}; } }
void CameraParameterReader::readParameters(const std::string& cameraParameterPath, const std::vector<std::string>& serialNumbers) { try { // Serial numbers if (serialNumbers.empty()) { mSerialNumbers = getFilesOnDirectory(cameraParameterPath, "xml"); for (auto& serialNumber : mSerialNumbers) serialNumber = getFileNameNoExtension(serialNumber); } else mSerialNumbers = serialNumbers; // Commong saving/loading const auto dataFormat = DataFormat::Xml; const std::vector<std::string> cvMatNames { "CameraMatrix", "Intrinsics", "Distortion" }; // Load parameters mCameraMatrices.clear(); mCameraExtrinsics.clear(); mCameraIntrinsics.clear(); mCameraDistortions.clear(); // log("Camera matrices:"); for (auto i = 0ull ; i < mSerialNumbers.size() ; i++) { const auto parameterPath = cameraParameterPath + mSerialNumbers.at(i); const auto cameraParameters = loadData(cvMatNames, parameterPath, dataFormat); // Error if empty element if (cameraParameters.empty() || cameraParameters.at(0).empty() || cameraParameters.at(1).empty() || cameraParameters.at(2).empty()) { const std::string errorMessage = " of the camera with serial number `" + mSerialNumbers[i] + "` (file: " + parameterPath + "." + dataFormatToString(dataFormat) + "). Is its format valid? You might want to check the example xml" + " file."; if (cameraParameters.empty()) error("Error at reading the camera parameters" + errorMessage, __LINE__, __FUNCTION__, __FILE__); if (cameraParameters.at(0).empty()) error("Error at reading the camera matrix parameters" + errorMessage, __LINE__, __FUNCTION__, __FILE__); if (cameraParameters.at(1).empty()) error("Error at reading the camera intrinsics parameters" + errorMessage, __LINE__, __FUNCTION__, __FILE__); if (cameraParameters.at(2).empty()) error("Error at reading the camera distortion parameters" + errorMessage, __LINE__, __FUNCTION__, __FILE__); } mCameraExtrinsics.emplace_back(cameraParameters.at(0)); mCameraIntrinsics.emplace_back(cameraParameters.at(1)); mCameraDistortions.emplace_back(cameraParameters.at(2)); mCameraMatrices.emplace_back(mCameraIntrinsics.back() * mCameraExtrinsics.back()); // log(cameraParameters.at(0)); } // // mCameraMatrices // log("\nFull camera matrices:"); // for (const auto& cvMat : mCameraMatrices) // log(cvMat); // // mCameraIntrinsics // log("\nCamera intrinsic parameters:"); // for (const auto& cvMat : mCameraIntrinsics) // log(cvMat); // // mCameraDistortions // log("\nCamera distortion parameters:"); // for (const auto& cvMat : mCameraDistortions) // log(cvMat); } catch (const std::exception& e) { error(e.what(), __LINE__, __FUNCTION__, __FILE__); } }