Skip to content

Commit a3f62fa

Browse files
committed
Samples: Improve intrinsic sample
Improve intrinsic sample to show the difference between fixed and estimated intrinsics. See https://support.zivid.com/en/latest/reference-articles/camera-intrinsics.html for more information.
1 parent 0abeeb4 commit a3f62fa

File tree

1 file changed

+86
-20
lines changed

1 file changed

+86
-20
lines changed

source/Camera/InfoUtilOther/GetCameraIntrinsics/GetCameraIntrinsics.cpp

Lines changed: 86 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Read intrinsic parameters from the Zivid camera (OpenCV model).
2+
Read intrinsic parameters from the Zivid camera (OpenCV model) or estimate them from the point cloud.
33
44
Note: This example uses experimental SDK features, which may be modified, moved, or deleted in the future without notice.
55
*/
@@ -10,54 +10,120 @@ Note: This example uses experimental SDK features, which may be modified, moved,
1010
#include <chrono>
1111
#include <iostream>
1212

13-
int main()
13+
namespace
1414
{
15-
try
15+
void printParameterDelta(const std::string &label, const double fixed_value, const double estimated_value)
1616
{
17-
Zivid::Application zivid;
18-
19-
std::cout << "Connecting to camera" << std::endl;
20-
auto camera = zivid.connectCamera();
17+
const auto delta = fixed_value - estimated_value;
18+
if(std::abs(delta) > 0.0)
19+
{
20+
std::cout << std::right << std::setfill(' ') << std::setw(6) << label << ": ";
21+
std::cout << std::right << std::setfill(' ') << std::setw(6) << std::fixed << std::setprecision(2) << delta;
22+
std::cout << " (" << std::right << std::setfill(' ') << std::setw(6) << std::fixed << std::setprecision(2)
23+
<< (100 * delta) / fixed_value << "% )";
24+
std::cout << std::endl;
25+
}
26+
}
2127

22-
std::cout << "Getting camera intrinsics" << std::endl;
23-
auto intrinsics = Zivid::Experimental::Calibration::intrinsics(camera);
28+
void printIntrinsicParametersDelta(
29+
const Zivid::CameraIntrinsics &fixed_intrinsics,
30+
const Zivid::CameraIntrinsics &estimated_intrinsics)
31+
{
32+
printParameterDelta(
33+
"CX", fixed_intrinsics.cameraMatrix().cx().value(), estimated_intrinsics.cameraMatrix().cx().value());
34+
printParameterDelta(
35+
"CY", fixed_intrinsics.cameraMatrix().cy().value(), estimated_intrinsics.cameraMatrix().cy().value());
36+
printParameterDelta(
37+
"FX", fixed_intrinsics.cameraMatrix().fx().value(), estimated_intrinsics.cameraMatrix().fx().value());
38+
printParameterDelta(
39+
"FY", fixed_intrinsics.cameraMatrix().fy().value(), estimated_intrinsics.cameraMatrix().fy().value());
2440

25-
std::cout << intrinsics << std::endl;
41+
printParameterDelta(
42+
"K1", fixed_intrinsics.distortion().k1().value(), estimated_intrinsics.distortion().k1().value());
43+
printParameterDelta(
44+
"K2", fixed_intrinsics.distortion().k2().value(), estimated_intrinsics.distortion().k2().value());
45+
printParameterDelta(
46+
"P1", fixed_intrinsics.distortion().p1().value(), estimated_intrinsics.distortion().p1().value());
47+
printParameterDelta(
48+
"P2", fixed_intrinsics.distortion().p2().value(), estimated_intrinsics.distortion().p2().value());
49+
}
2650

51+
void printIntrinsicParametersWithDescription(const Zivid::CameraIntrinsics &intrinsics)
52+
{
2753
std::cout << "Separated camera intrinsic parameters with description:" << std::endl;
2854

29-
std::cout << " CX: " << std::left << std::setfill(' ') << std::setw(13)
55+
std::cout << " CX: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(2)
3056
<< intrinsics.cameraMatrix().cx().value() << Zivid::CameraIntrinsics::CameraMatrix::CX::description
3157
<< std::endl;
32-
std::cout << " CY: " << std::left << std::setfill(' ') << std::setw(13)
58+
std::cout << " CY: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(2)
3359
<< intrinsics.cameraMatrix().cy().value() << Zivid::CameraIntrinsics::CameraMatrix::CY::description
3460
<< std::endl;
35-
std::cout << " FX: " << std::left << std::setfill(' ') << std::setw(13)
61+
std::cout << " FX: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(2)
3662
<< intrinsics.cameraMatrix().fx().value() << Zivid::CameraIntrinsics::CameraMatrix::FX::description
3763
<< std::endl;
38-
std::cout << " FY: " << std::left << std::setfill(' ') << std::setw(13)
64+
std::cout << " FY: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(2)
3965
<< intrinsics.cameraMatrix().fy().value() << Zivid::CameraIntrinsics::CameraMatrix::FY::description
4066
<< std::endl;
4167

42-
std::cout << " K1: " << std::left << std::setfill(' ') << std::setw(13)
68+
std::cout << " K1: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(4)
4369
<< intrinsics.distortion().k1().value() << Zivid::CameraIntrinsics::Distortion::K1::description
4470
<< std::endl;
45-
std::cout << " K2: " << std::left << std::setfill(' ') << std::setw(13)
71+
std::cout << " K2: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(4)
4672
<< intrinsics.distortion().k2().value() << Zivid::CameraIntrinsics::Distortion::K2::description
4773
<< std::endl;
48-
std::cout << " K3: " << std::left << std::setfill(' ') << std::setw(13)
74+
std::cout << " K3: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(4)
4975
<< intrinsics.distortion().k3().value() << Zivid::CameraIntrinsics::Distortion::K3::description
5076
<< std::endl;
51-
std::cout << " P1: " << std::left << std::setfill(' ') << std::setw(13)
77+
std::cout << " P1: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(4)
5278
<< intrinsics.distortion().p1().value() << Zivid::CameraIntrinsics::Distortion::P1::description
5379
<< std::endl;
54-
std::cout << " P2: " << std::left << std::setfill(' ') << std::setw(13)
80+
std::cout << " P2: " << std::left << std::setfill(' ') << std::setw(13) << std::fixed << std::setprecision(4)
5581
<< intrinsics.distortion().p2().value() << Zivid::CameraIntrinsics::Distortion::P2::description
5682
<< std::endl;
83+
}
84+
} // namespace
5785

58-
std::string outputFile = "Intrinsics.yml";
86+
int main()
87+
{
88+
try
89+
{
90+
Zivid::Application zivid;
91+
92+
std::cout << "Connecting to camera" << std::endl;
93+
auto camera = zivid.connectCamera();
94+
95+
std::cout << "Getting camera intrinsics" << std::endl;
96+
const auto intrinsics = Zivid::Experimental::Calibration::intrinsics(camera);
97+
98+
std::cout << intrinsics << std::endl;
99+
100+
const std::string outputFile = "Intrinsics.yml";
59101
std::cout << "Saving camera intrinsics to file: " << outputFile << std::endl;
60102
intrinsics.save(outputFile);
103+
104+
printIntrinsicParametersWithDescription(intrinsics);
105+
106+
std::cout
107+
<< std::endl
108+
<< "Difference between fixed intrinsics and estimated intrinsics for different apertures and temperatures:"
109+
<< std::endl;
110+
111+
for(const auto aperture : { 11.31, 5.66, 2.83 })
112+
{
113+
const auto settings =
114+
Zivid::Settings{ Zivid::Settings::Experimental::Engine::phase,
115+
Zivid::Settings::Acquisitions{ Zivid::Settings::Acquisition{
116+
Zivid::Settings::Acquisition::Aperture{ aperture } } },
117+
Zivid::Settings::Processing::Filters::Outlier::Removal::Enabled::yes,
118+
Zivid::Settings::Processing::Filters::Outlier::Removal::Threshold{ 5.0 } };
119+
const auto frame = camera.capture(settings);
120+
const auto estimated_intrinsics = Zivid::Experimental::Calibration::estimateIntrinsics(frame);
121+
const auto temperature = frame.state().temperature().lens().value();
122+
std::cout << std::endl
123+
<< "Aperture: " << std::fixed << std::setprecision(2) << aperture
124+
<< ", Lens Temperature: " << temperature << "\370C" << std::endl;
125+
printIntrinsicParametersDelta(intrinsics, estimated_intrinsics);
126+
}
61127
}
62128
catch(const std::exception &e)
63129
{

0 commit comments

Comments
 (0)