diff --git a/README.md b/README.md index fde6fc89..c45f88ea 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,8 @@ from the camera can be used. - [CreateDepthMap](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/CreateDepthMap/CreateDepthMap.cpp) - Convert point cloud from a ZDF file to OpenCV format, extract depth map and visualize it. - [Downsample](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/Downsample/Downsample.cpp) - Downsample point cloud from a ZDF file. + - [ExploreSettingsMetaData](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/ExploreSettingsMetaData/ExploreSettingsMetaData.cpp) - Recursively iterates through all leaf parameters in a + Zivid camera’s settings. - [GammaCorrection](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/GammaCorrection/GammaCorrection.cpp) - Capture 2D image with gamma correction. - [HandEyeCalibration](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/HandEyeCalibration/HandEyeCalibration/HandEyeCalibration.cpp) - Perform Hand-Eye calibration. - [MaskPointCloud](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/MaskPointCloud/MaskPointCloud.cpp) - Mask point cloud from a ZDF file and convert to PCL diff --git a/source/Applications/Advanced/ExploreSettingsMetaData/ExploreSettingsMetaData.cpp b/source/Applications/Advanced/ExploreSettingsMetaData/ExploreSettingsMetaData.cpp new file mode 100644 index 00000000..33f78815 --- /dev/null +++ b/source/Applications/Advanced/ExploreSettingsMetaData/ExploreSettingsMetaData.cpp @@ -0,0 +1,172 @@ + +/* +Recursively iterates through all leaf parameters in a Zivid camera’s settings. + +This sample walks the entire settings tree and inspects each leaf parameter. +For every parameter, it prints: + - the current value if explicitly set, + - otherwise the camera’s default value, + - and any available metadata (valid ranges or discrete allowed values) +*/ + +#include +#include +#include + +namespace +{ + template + void printValidRange(const Zivid::CameraInfo &cameraInfo) + { + const auto range = Zivid::Experimental::SettingsInfo::validRange(cameraInfo); + + std::cout << " ValidRange: [" << Node{ range.min() } << " , " << Node{ range.max() } << "]\n"; + } + + template + void printValidValues(const Zivid::CameraInfo &cameraInfo) + { + const auto validValues = Zivid::Experimental::SettingsInfo::validValues(cameraInfo); + + std::cout << " ValidValues: "; + for(const auto &value : validValues) + { + std::cout << value << " "; + } + std::cout << "\n"; + } + + template + void inspectLeaf(const Node &node, const Zivid::CameraInfo &cameraInfo) + { + using DecayedNode = std::decay_t; + + if constexpr(DecayedNode::nodeType == Zivid::DataModel::NodeType::leafValue) + { + std::cout << "Parameter: " << DecayedNode::path << "\n"; + + if constexpr(Zivid::DataModel::IsOptional::value) + { + std::cout << " CurrentValue: "; + if(node.hasValue()) + { + std::cout << node.toString() << "\n"; + } + else + { + std::cout << "(unset)\n"; + + const auto defaultValue = Zivid::Experimental::SettingsInfo::defaultValue(cameraInfo); + std::cout << " DefaultValue: "; + std::cout << defaultValue.toString() << "\n"; + } + } + else + { + std::cout << " CurrentValue: " << node.toString() << "\n"; + } + + constexpr bool hasRange = Zivid::DataModel::HasValidRange::value; + constexpr bool hasValues = Zivid::DataModel::HasValidValues::value; + + if constexpr(hasRange) + { + printValidRange(cameraInfo); + } + + if constexpr(hasValues) + { + printValidValues(cameraInfo); + } + + if constexpr(!hasRange && !hasValues) + { + std::cout << " No predefined valid range or discrete values.\n"; + } + + std::cout << "\n"; + } + } + + // Recursively traverses nested data model leaves and lists + template + void traverseLeavesIntoNestedDataModelsAndLists(Node &node, const LeafVisitor &leafVisitor) + { + using DecayedNode = std::decay_t; + + if constexpr( + DecayedNode::nodeType == Zivid::DataModel::NodeType::group + || DecayedNode::nodeType == Zivid::DataModel::NodeType::leafDataModelList) + { + std::forward(node).forEach([&](auto &&childNode) { + traverseLeavesIntoNestedDataModelsAndLists(std::forward(childNode), leafVisitor); + }); + } + else if constexpr( + DecayedNode::nodeType == Zivid::DataModel::NodeType::leafValue + && Zivid::DataModel::IsNestedDataModelLeaf::value) + { + leafVisitor(node); + + if constexpr(Zivid::DataModel::IsOptional::value) + { + if(node.hasValue()) + { + traverseLeavesIntoNestedDataModelsAndLists(node.value(), leafVisitor); + } + } + else + { + traverseLeavesIntoNestedDataModelsAndLists(node.value(), leafVisitor); + } + } + else + { + leafVisitor(std::forward(node)); + } + } + + // Serves as the entry point to traverse a Settings object and print all leaves + template + void traverseAndPrint(const SettingsType &settings, const Zivid::CameraInfo &cameraInfo) + { + traverseLeavesIntoNestedDataModelsAndLists(settings, [&](const auto &node) { inspectLeaf(node, cameraInfo); }); + } +} // namespace + +int main() +{ + try + { + Zivid::Application app; + + std::cout << "Connecting to camera...\n"; + auto camera = app.connectCamera(); + const auto cameraInfo = camera.info(); + + std::cout << "Camera model: " << cameraInfo.modelName() << "\n"; + std::cout << "Serial number: " << cameraInfo.serialNumber() << "\n"; + + // Default 2D Settings (mostly set) + auto defaultSettings2DWithAcquisition = + Zivid::Experimental::SettingsInfo::defaultValue(cameraInfo) + .copyWith( + Zivid::Settings2D::Acquisitions{ + Zivid::Experimental::SettingsInfo::defaultValue(cameraInfo) }); + + // Minimal 3D Settings (mostly unset) + Zivid::Settings settings; + settings.set(Zivid::Settings::Acquisitions{ Zivid::Settings::Acquisition{} }); + settings.set(Zivid::Settings::Color{ defaultSettings2DWithAcquisition }); + + std::cout << "---- Traversing Settings ----\n"; + traverseAndPrint(settings, cameraInfo); + } + catch(const std::exception &e) + { + std::cerr << "Error: " << e.what() << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/source/Applications/Advanced/HandEyeCalibration/PoseConversions/PoseConversions.cpp b/source/Applications/Advanced/HandEyeCalibration/PoseConversions/PoseConversions.cpp index b44bb7f2..0be3dade 100644 --- a/source/Applications/Advanced/HandEyeCalibration/PoseConversions/PoseConversions.cpp +++ b/source/Applications/Advanced/HandEyeCalibration/PoseConversions/PoseConversions.cpp @@ -253,3 +253,4 @@ int main() return EXIT_SUCCESS; } + diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index ef9cbdc5..3a1eae44 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -37,6 +37,7 @@ set(SAMPLES Applications/Advanced/CaptureUndistort2D Applications/Advanced/CreateDepthMap Applications/Advanced/Downsample + Applications/Advanced/ExploreSettingsMetaData Applications/Advanced/GammaCorrection Applications/Advanced/MaskPointCloud Applications/Advanced/ProjectAndFindMarker