ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ccCameraSensor.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include <pybind11/native_enum.h>
9 #include <pybind11/pybind11.h>
10 
11 #include <ecvCameraSensor.h>
12 #include <ecvMesh.h>
13 #include <ecvPointCloud.h>
14 
15 #include "../casters.h"
16 
17 namespace py = pybind11;
18 using namespace pybind11::literals;
19 
20 void define_ccCameraSensor(py::module &m)
21 {
22  py::class_<ccCameraSensor, ccSensor> pyccCameraSensor(m, "ccCameraSensor");
23 
24  py::class_<ccCameraSensor::IntrinsicParameters>(pyccCameraSensor, "IntrinsicParameters")
25  .def(py::init<>())
26  .def_static("GetKinectDefaults",
28  "params"_a)
29  .def_readwrite("vertFocal_pix", &ccCameraSensor::IntrinsicParameters::vertFocal_pix)
30  .def_property(
31  "pixelSize_mm",
32  [](const ccCameraSensor::IntrinsicParameters &self) -> py::tuple
33  { return py::make_tuple(self.pixelSize_mm[0], self.pixelSize_mm[1]); },
34  [](ccCameraSensor::IntrinsicParameters &self, const py::tuple &pixelSize)
35  {
36  auto x = pixelSize[0].cast<float>();
37  auto y = pixelSize[1].cast<float>();
38  self.pixelSize_mm[0] = x;
39  self.pixelSize_mm[1] = y;
40  })
41  .def_readwrite("skew", &ccCameraSensor::IntrinsicParameters::skew)
42  .def_readwrite("vFOV_rad", &ccCameraSensor::IntrinsicParameters::vFOV_rad)
43  .def_readwrite("zNear_mm", &ccCameraSensor::IntrinsicParameters::zNear_mm)
44  .def_readwrite("zFar_mm", &ccCameraSensor::IntrinsicParameters::zFar_mm)
45  .def_readwrite("arrayWidth", &ccCameraSensor::IntrinsicParameters::arrayWidth)
46  .def_readwrite("arrayHeight", &ccCameraSensor::IntrinsicParameters::arrayHeight)
48 
49  py::native_enum<ccCameraSensor::DistortionModel>(
50  pyccCameraSensor, "DistortionModel", "enum.Enum", "ccCameraSensor::DistortionModel.")
51  .value("NO_DISTORTION_MODEL", ccCameraSensor::DistortionModel::NO_DISTORTION_MODEL)
52  .value("SIMPLE_RADIAL_DISTORTION",
53  ccCameraSensor::DistortionModel::SIMPLE_RADIAL_DISTORTION)
54  .value("BROWN_DISTORTION", ccCameraSensor::DistortionModel::BROWN_DISTORTION)
55  .value("EXTENDED_RADIAL_DISTORTION",
56  ccCameraSensor::DistortionModel::EXTENDED_RADIAL_DISTORTION)
57  .export_values()
58  .finalize();
59 
60  py::class_<ccCameraSensor::LensDistortionParameters>(pyccCameraSensor,
61  "LensDistortionParameters")
63 
66  "RadialDistortionParameters")
69 
72  "ExtendedRadialDistortionParameters")
74 
75  py::class_<ccCameraSensor::BrownDistortionParameters, ccCameraSensor::LensDistortionParameters>(
76  pyccCameraSensor, "BrownDistortionParameters")
77  .def_property(
78  "principalPointOffset",
79  [](const ccCameraSensor::BrownDistortionParameters &self) -> py::tuple
80  { return py::make_tuple(self.principalPointOffset[0], self.principalPointOffset[1]); },
82  const py::tuple &principalPointOffset)
83  {
84  auto x = principalPointOffset[0].cast<float>();
85  auto y = principalPointOffset[1].cast<float>();
86  self.principalPointOffset[0] = x;
87  self.principalPointOffset[1] = y;
88  })
89  .def_property(
90  "linearDisparityParams",
91  [](const ccCameraSensor::BrownDistortionParameters &self) -> py::tuple {
92  return py::make_tuple(self.linearDisparityParams[0], self.linearDisparityParams[1]);
93  },
95  const py::tuple &linearDisparityParams)
96  {
97  auto x = linearDisparityParams[0].cast<float>();
98  auto y = linearDisparityParams[1].cast<float>();
99  self.linearDisparityParams[0] = x;
100  self.linearDisparityParams[1] = y;
101  })
102  .def_property(
103  "K_BrownParams",
104  [](const ccCameraSensor::BrownDistortionParameters &self) -> py::tuple {
105  return py::make_tuple(
106  self.K_BrownParams[0], self.K_BrownParams[1], self.K_BrownParams[2]);
107  },
108  [](ccCameraSensor::BrownDistortionParameters &self, const py::tuple &K_BrownParams)
109  {
110  auto x = K_BrownParams[0].cast<float>();
111  auto y = K_BrownParams[1].cast<float>();
112  auto z = K_BrownParams[2].cast<float>();
113 
114  self.K_BrownParams[0] = x;
115  self.K_BrownParams[1] = y;
116  self.K_BrownParams[2] = z;
117  })
118  .def_property(
119  "P_BrownParams",
120  [](const ccCameraSensor::BrownDistortionParameters &self) -> py::tuple
121  { return py::make_tuple(self.P_BrownParams[0], self.P_BrownParams[1]); },
122  [](ccCameraSensor::BrownDistortionParameters &self, const py::tuple &P_BrownParams)
123  {
124  auto x = P_BrownParams[0].cast<float>();
125  auto y = P_BrownParams[1].cast<float>();
126  self.P_BrownParams[0] = x;
127  self.P_BrownParams[1] = y;
128  });
129 
130  py::class_<ccCameraSensor::FrustumInformation>(pyccCameraSensor, "FrustumInformation")
131  .def(py::init<>())
132  .def("initFrustumCorners", &ccCameraSensor::FrustumInformation::initFrustumCorners)
134  .def_readwrite("isComputed", &ccCameraSensor::FrustumInformation::isComputed)
135  .def_readwrite("drawFrustum", &ccCameraSensor::FrustumInformation::drawFrustum)
136  .def_readwrite("drawSidePlanes", &ccCameraSensor::FrustumInformation::drawSidePlanes)
137  .def_readwrite("frustumCorners",
139  py::return_value_policy::reference)
140  .def_readwrite("frustumHull",
142  py::return_value_policy::reference)
143  .def_readwrite("center", &ccCameraSensor::FrustumInformation::center);
144 
145  pyccCameraSensor
146  .def(py::init<ccCameraSensor::IntrinsicParameters>())
147  // getters and setters
148  .def("setVertFocal_pix", &ccCameraSensor::setVertFocal_pix, "vertFocal_pix"_a)
149  .def("getHorizFocal_pix", &ccCameraSensor::getHorizFocal_pix)
150  .def("getHorizFocal_pix", &ccCameraSensor::getHorizFocal_pix)
151  .def("setVerticalFov_rad", &ccCameraSensor::setVerticalFov_rad, "fov_rad"_a)
152  .def("getVerticalFov_rad", &ccCameraSensor::getVerticalFov_rad)
153  .def("getIntrinsicParameters", &ccCameraSensor::getIntrinsicParameters)
154  .def("setIntrinsicParameters", &ccCameraSensor::setIntrinsicParameters, "params"_a)
155  .def(
156  "getIntrinsicParameters",
158  { return self.getDistortionParameters().data(); },
159  py::return_value_policy::reference);
160  // TODO setDistortionParameters
161  // TODO getProjectionMatrix and below
162 }
void define_ccCameraSensor(py::module &m)
Camera (projective) sensor.
void setVerticalFov_rad(float fov_rad)
Sets the (vertical) field of view in radians.
float getVerticalFov_rad() const
Returns the (vertical) field of view in radians.
void setVertFocal_pix(float vertFocal_pix)
Sets focal (in pixels)
void setIntrinsicParameters(const IntrinsicParameters &params)
Sets intrinsic parameters.
const IntrinsicParameters & getIntrinsicParameters() const
Returns intrinsic parameters.
float getHorizFocal_pix() const
Returns horizontal focal (in pixels)
Brown's distortion model + Linear Disparity.
float k3
3rd radial distortion coefficient
bool initFrustumCorners()
Reserves memory for the frustum corners cloud.
bool initFrustumHull()
Creates the frustum hull mesh.
Intrinsic parameters of the camera sensor.
static void GetKinectDefaults(IntrinsicParameters &params)
float horizFocal_pix() const
Returns the horizontal focal pix.
Lens distortion parameters (interface)
virtual DistortionModel getModel() const =0
Returns distortion model type.
Simple radial distortion model.
float k2
2nd radial distortion coefficient
float k1
1st radial distortion coefficient