Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,16 @@ Checks: >
-bugprone-easily-swappable-parameters,
-concurrency-mt-unsafe,
-abseil-*,
-google-build-using-namespace
-google-build-using-namespace,
-misc-include-cleaner,
-performance-avoid-endl,
-misc-const-correctness,
-llvm-prefer-static-over-anonymous-namespace,
-boost-use-ranges,
-portability-template-virtual-member-function,
-cppcoreguidelines-avoid-do-while,
-performance-enum-size,
-readability-math-missing-parentheses,
WarningsAsErrors: '*'
HeaderFilterRegex: '.*'
CheckOptions:
Expand Down
36 changes: 18 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,10 @@ 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
format, extract depth map and visualize it.
- [ProjectAndFindMarker](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/ProjectAndFindMarker/ProjectAndFindMarker.cpp) - Show a marker using the projector, capture a set of 2D
images to find the marker coordinates (2D and 3D).
- [ReadProjectAndCaptureImage](https://github.com/zivid/zivid-cpp-samples/tree/master/source/Applications/Advanced/ReadProjectAndCaptureImage/ReadProjectAndCaptureImage.cpp) - Read a 2D image from file and project it using the camera
Expand Down Expand Up @@ -169,9 +169,9 @@ from the camera can be used.
## Installation

1. [Install Zivid
Software](https://support.zivid.com/latest//getting-started/software-installation.html)
Software](https://support.zivid.com/en/latest//camera/getting-started/software-installation.html)
2. [Download Zivid Sample
Data](https://support.zivid.com/latest//api-reference/samples/sample-data.html)
Data](https://support.zivid.com/en/latest//camera/api-reference/samples/sample-data.html)

**Windows**

Expand All @@ -188,7 +188,7 @@ git clone https://github.com/zivid/zivid-cpp-samples
Configure the sample solution with CMake, open it in Visual Studio,
build it, run it. For more information see [Configure C++ Samples With
CMake and Build Them in Visual Studio in
Windows](https://support.zivid.com/latest/api-reference/samples/cpp/configure-cpp-samples-with-cmake-and-build-them-in-visual-studio-on-windows.html).
Windows](https://support.zivid.com/en/latest/camera/api-reference/samples/cpp/configure-cpp-samples-with-cmake-and-build-them-in-visual-studio-on-windows.html).

**Ubuntu**

Expand Down Expand Up @@ -218,7 +218,7 @@ respectively, to `cmake`: `-DUSE_EIGEN3=OFF`, `-DUSE_OPENCV=OFF`,
`-DUSE_PCL=OFF`, `-DUSE_HALCON=OFF`.

See [Configure C++ Samples With Optional
Dependencies](https://support.zivid.com/latest/api-reference/samples/cpp/configure-cpp-samples-with-optional-dependencies.html)
Dependencies](https://support.zivid.com/en/latest/camera/api-reference/samples/cpp/configure-cpp-samples-with-optional-dependencies.html)
for instructions on how to install the optional dependencies and
configure the samples to use them.

Expand All @@ -235,12 +235,12 @@ Zivid offers two ways of interfacing with HALCON:

1. Through the Zivid SDK, utilizing the C++/C\# libraries available for
HALCON. We provide samples for both
[C++](https://support.zivid.com/latest//api-reference/samples/cpp.html)
[C++](https://support.zivid.com/en/latest//camera/api-reference/samples/cpp.html)
and
[C\#](https://support.zivid.com/latest//api-reference/samples/csharp.html).
[C\#](https://support.zivid.com/en/latest//camera/api-reference/samples/csharp.html).
(**Recommended**)
2. Directly through a GenICam GenTL producer that comes with the [Zivid
Software](https://support.zivid.com/latest//getting-started/software-installation.html).
Software](https://support.zivid.com/en/latest//camera/getting-started/software-installation.html).

Zivid and HALCON are compatible with Windows 10 and 11, and Ubuntu
20.04, 22.04, 24.04.
Expand All @@ -257,17 +257,17 @@ To set up and use Zivid in one of these operating systems, please follow
their respective instructions on the following pages:

- [Install Zivid + HALCON for
Windows](https://support.zivid.com/latest/api-reference/samples/halcon/install-zivid-halcon-for-windows.html)
Windows](https://support.zivid.com/en/latest/camera/api-reference/samples/halcon/install-zivid-halcon-for-windows.html)
- [Install Zivid + HALCON for
LINUX](https://support.zivid.com/latest/api-reference/samples/halcon/install-zivid-halcon-for-linux.html)
LINUX](https://support.zivid.com/en/latest/camera/api-reference/samples/halcon/install-zivid-halcon-for-linux.html)
- [Create a HALCON "Hello World"
Program](https://support.zivid.com/latest/api-reference/samples/halcon/create-a-halcon-hello-world.html)
Program](https://support.zivid.com/en/latest/camera/api-reference/samples/halcon/create-a-halcon-hello-world.html)
- [How to Run a HALCON
Sample](https://support.zivid.com/latest/api-reference/samples/halcon/how-to-run-a-halcon-sample.html)
Sample](https://support.zivid.com/en/latest/camera/api-reference/samples/halcon/how-to-run-a-halcon-sample.html)
- [Debug in
HALCON](https://support.zivid.com/latest/api-reference/samples/halcon/halcon-debug.html)
HALCON](https://support.zivid.com/en/latest/camera/api-reference/samples/halcon/halcon-debug.html)
- [HALCON Sample
Videos](https://support.zivid.com/latest/api-reference/samples/halcon/halcon-sample-videos.html)
Videos](https://support.zivid.com/en/latest/camera/api-reference/samples/halcon/halcon-sample-videos.html)

The following HALCON versions have been tested and confirmed to work
with Zivid cameras:
Expand All @@ -280,9 +280,9 @@ We recommend using one of the HALCON versions we have tested.
## Support

For more information about the Zivid cameras, please visit our
[Knowledge Base](https://support.zivid.com/latest). If you run into any
issues please check out
[Troubleshooting](https://support.zivid.com/latest/support/troubleshooting.html).
[Knowledge Base](https://support.zivid.com/en/latest). If you run into
any issues please check out
[Troubleshooting](https://support.zivid.com/en/latest/camera/support/troubleshooting.html).

## License

Expand Down
Original file line number Diff line number Diff line change
@@ -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 <Zivid/Experimental/SettingsInfo.h>
#include <Zivid/Zivid.h>
#include <iostream>

namespace
{
template<typename Node>
void printValidRange(const Zivid::CameraInfo &cameraInfo)
{
const auto range = Zivid::Experimental::SettingsInfo::validRange<Node>(cameraInfo);

std::cout << " ValidRange: [" << Node{ range.min() } << " , " << Node{ range.max() } << "]\n";
}

template<typename Node>
void printValidValues(const Zivid::CameraInfo &cameraInfo)
{
const auto validValues = Zivid::Experimental::SettingsInfo::validValues<Node>(cameraInfo);

std::cout << " ValidValues: ";
for(const auto &value : validValues)
{
std::cout << value << " ";
}
std::cout << "\n";
}

template<typename Node>
void inspectLeaf(const Node &node, const Zivid::CameraInfo &cameraInfo)
{
using DecayedNode = std::decay_t<Node>;

if constexpr(DecayedNode::nodeType == Zivid::DataModel::NodeType::leafValue)
{
std::cout << "Parameter: " << DecayedNode::path << "\n";

if constexpr(Zivid::DataModel::IsOptional<DecayedNode>::value)
{
std::cout << " CurrentValue: ";
if(node.hasValue())
{
std::cout << node.toString() << "\n";
}
else
{
std::cout << "(unset)\n";

const auto defaultValue = Zivid::Experimental::SettingsInfo::defaultValue<DecayedNode>(cameraInfo);
std::cout << " DefaultValue: ";
std::cout << defaultValue.toString() << "\n";
}
}
else
{
std::cout << " CurrentValue: " << node.toString() << "\n";
}

constexpr bool hasRange = Zivid::DataModel::HasValidRange<DecayedNode>::value;
constexpr bool hasValues = Zivid::DataModel::HasValidValues<DecayedNode>::value;

if constexpr(hasRange)
{
printValidRange<DecayedNode>(cameraInfo);
}

if constexpr(hasValues)
{
printValidValues<DecayedNode>(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<typename Node, typename LeafVisitor>
void traverseLeavesIntoNestedDataModelsAndLists(Node &node, const LeafVisitor &leafVisitor)
{
using DecayedNode = std::decay_t<Node>;

if constexpr(
DecayedNode::nodeType == Zivid::DataModel::NodeType::group
|| DecayedNode::nodeType == Zivid::DataModel::NodeType::leafDataModelList)
{
std::forward<Node>(node).forEach([&](auto &&childNode) {
traverseLeavesIntoNestedDataModelsAndLists(std::forward<decltype(childNode)>(childNode), leafVisitor);
});
}
else if constexpr(
DecayedNode::nodeType == Zivid::DataModel::NodeType::leafValue
&& Zivid::DataModel::IsNestedDataModelLeaf<DecayedNode>::value)
{
leafVisitor(node);

if constexpr(Zivid::DataModel::IsOptional<DecayedNode>::value)
{
if(node.hasValue())
{
traverseLeavesIntoNestedDataModelsAndLists(node.value(), leafVisitor);
}
}
else
{
traverseLeavesIntoNestedDataModelsAndLists(node.value(), leafVisitor);
}
}
else
{
leafVisitor(std::forward<Node>(node));
}
}

// Serves as the entry point to traverse a Settings object and print all leaves
template<typename SettingsType>
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<Zivid::Settings2D>(cameraInfo)
.copyWith(
Zivid::Settings2D::Acquisitions{
Zivid::Experimental::SettingsInfo::defaultValue<Zivid::Settings2D::Acquisition>(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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,4 @@ int main()

return EXIT_SUCCESS;
}

Loading
Loading