Skip to content

Commit a3de54b

Browse files
committed
improving compatibility
1 parent 8fa0adf commit a3de54b

7 files changed

Lines changed: 224 additions & 50 deletions

File tree

src/openptv_python/_native_compat.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,40 @@ def _optional_import(module_name: str) -> ModuleType | None:
6868
)
6969

7070

71+
def _install_property_alias(cls: Any, attr_name: str, getter_name: str, setter_name: str | None = None) -> None:
72+
if hasattr(cls, attr_name):
73+
return
74+
75+
def getter(self):
76+
getter = getattr(self, getter_name)
77+
return getter()
78+
79+
def setter(self, value):
80+
if setter_name is None:
81+
raise AttributeError(f"{attr_name} is read-only")
82+
setter = getattr(self, setter_name)
83+
return setter(value)
84+
85+
try:
86+
setattr(cls, attr_name, property(getter, None if setter_name is None else setter))
87+
except (TypeError, AttributeError):
88+
return
89+
90+
91+
if optv_parameters is not None:
92+
volume_params_cls = getattr(optv_parameters, "VolumeParams", None)
93+
if volume_params_cls is not None:
94+
_install_property_alias(volume_params_cls, "x_lay", "get_X_lay", "set_X_lay")
95+
_install_property_alias(volume_params_cls, "z_min_lay", "get_Zmin_lay", "set_Zmin_lay")
96+
_install_property_alias(volume_params_cls, "z_max_lay", "get_Zmax_lay", "set_Zmax_lay")
97+
_install_property_alias(volume_params_cls, "cn", "get_cn", "set_cn")
98+
_install_property_alias(volume_params_cls, "cnx", "get_cnx", "set_cnx")
99+
_install_property_alias(volume_params_cls, "cny", "get_cny", "set_cny")
100+
_install_property_alias(volume_params_cls, "csumg", "get_csumg", "set_csumg")
101+
_install_property_alias(volume_params_cls, "corrmin", "get_corrmin", "set_corrmin")
102+
_install_property_alias(volume_params_cls, "eps0", "get_eps0", "set_eps0")
103+
104+
71105
def _emit_engine_warning(reason: str) -> None:
72106
global _ENGINE_WARNING_EMITTED
73107
if _ENGINE_WARNING_EMITTED:

src/openptv_python/_native_convert.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,26 @@ def from_native_calibration(calibration_obj):
5555
if isinstance(calibration_obj, Calibration):
5656
return calibration_obj
5757

58-
converted = Calibration()
59-
converted.set_pos(np.array(calibration_obj.get_pos()))
60-
converted.set_angles(np.array(calibration_obj.get_angles()))
61-
converted.set_primary_point(np.array(calibration_obj.get_primary_point()))
62-
converted.set_radial_distortion(np.array(calibration_obj.get_radial_distortion()))
63-
converted.set_decentering(np.array(calibration_obj.get_decentering()))
64-
65-
affine = np.array(calibration_obj.get_affine())
66-
if hasattr(converted, "set_affine_trans"):
67-
converted.set_affine_trans(affine)
68-
elif hasattr(converted, "set_affine_distortion"):
69-
converted.set_affine_distortion(affine)
70-
else:
71-
raise AttributeError("Calibration object does not support affine setters")
72-
73-
converted.set_glass_vec(np.array(calibration_obj.get_glass_vec()))
74-
return converted
58+
try:
59+
converted = Calibration()
60+
converted.set_pos(np.array(calibration_obj.get_pos()))
61+
converted.set_angles(np.array(calibration_obj.get_angles()))
62+
converted.set_primary_point(np.array(calibration_obj.get_primary_point()))
63+
converted.set_radial_distortion(np.array(calibration_obj.get_radial_distortion()))
64+
converted.set_decentering(np.array(calibration_obj.get_decentering()))
65+
66+
affine = np.array(calibration_obj.get_affine())
67+
if hasattr(converted, "set_affine_trans"):
68+
converted.set_affine_trans(affine)
69+
elif hasattr(converted, "set_affine_distortion"):
70+
converted.set_affine_distortion(affine)
71+
else:
72+
raise AttributeError("Calibration object does not support affine setters")
73+
74+
converted.set_glass_vec(np.array(calibration_obj.get_glass_vec()))
75+
return converted
76+
except (TypeError, ValueError, AttributeError):
77+
return calibration_obj
7578

7679

7780
def to_native_control_par(cpar: ControlPar):

src/openptv_python/epi.py

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,24 @@ def sort_coord2d_y(crd: np.ndarray) -> np.ndarray:
4848
return np.sort(crd, order="y")
4949

5050

51+
def _volume_x_lay(vpar: VolumePar) -> list[float]:
52+
if hasattr(vpar, "get_X_lay"):
53+
return list(vpar.get_X_lay())
54+
return list(vpar.x_lay)
55+
56+
57+
def _volume_z_min_lay(vpar: VolumePar) -> list[float]:
58+
if hasattr(vpar, "get_Zmin_lay"):
59+
return list(vpar.get_Zmin_lay())
60+
return list(vpar.z_min_lay)
61+
62+
63+
def _volume_z_max_lay(vpar: VolumePar) -> list[float]:
64+
if hasattr(vpar, "get_Zmax_lay"):
65+
return list(vpar.get_Zmax_lay())
66+
return list(vpar.z_max_lay)
67+
68+
5169
def epi_mm(xl, yl, cal1, cal2, mmp, vpar) -> Tuple[float, float, float, float]:
5270
"""Return the end points of the epipolar line in the "second" camera.
5371
@@ -85,15 +103,19 @@ def epi_mm(xl, yl, cal1, cal2, mmp, vpar) -> Tuple[float, float, float, float]:
85103
pos, v = ray_tracing(xl, yl, cal1, mmp)
86104

87105
# calculate min and max depth for position (valid only for one setup)
88-
z_min = vpar.z_min_lay[0] + (pos[0] - vpar.x_lay[0]) * (
89-
vpar.z_min_lay[1] - vpar.z_min_lay[0]
90-
) / (vpar.x_lay[1] - vpar.x_lay[0])
106+
x_lay = _volume_x_lay(vpar)
107+
z_min_lay = _volume_z_min_lay(vpar)
108+
z_max_lay = _volume_z_max_lay(vpar)
109+
110+
z_min = z_min_lay[0] + (pos[0] - x_lay[0]) * (
111+
z_min_lay[1] - z_min_lay[0]
112+
) / (x_lay[1] - x_lay[0])
91113

92114
z_max = float(
93-
vpar.z_max_lay[0]
94-
+ (pos[0] - vpar.x_lay[0])
95-
* (vpar.z_max_lay[1] - vpar.z_max_lay[0])
96-
/ (vpar.x_lay[1] - vpar.x_lay[0])
115+
z_max_lay[0]
116+
+ (pos[0] - x_lay[0])
117+
* (z_max_lay[1] - z_max_lay[0])
118+
/ (x_lay[1] - x_lay[0])
97119
)
98120

99121
X = move_along_ray(z_min, pos, v)
@@ -142,12 +164,16 @@ def epi_mm_2D(
142164
"""
143165
pos, v = ray_tracing(xl, yl, cal1, mmp)
144166

145-
z_min = vpar.z_min_lay[0] + (pos[0] - vpar.x_lay[0]) * (
146-
vpar.z_min_lay[1] - vpar.z_min_lay[0]
147-
) / (vpar.x_lay[1] - vpar.x_lay[0])
148-
z_max = vpar.z_max_lay[0] + (pos[0] - vpar.x_lay[0]) * (
149-
vpar.z_max_lay[1] - vpar.z_max_lay[0]
150-
) / (vpar.x_lay[1] - vpar.x_lay[0])
167+
x_lay = _volume_x_lay(vpar)
168+
z_min_lay = _volume_z_min_lay(vpar)
169+
z_max_lay = _volume_z_max_lay(vpar)
170+
171+
z_min = z_min_lay[0] + (pos[0] - x_lay[0]) * (
172+
z_min_lay[1] - z_min_lay[0]
173+
) / (x_lay[1] - x_lay[0])
174+
z_max = z_max_lay[0] + (pos[0] - x_lay[0]) * (z_max_lay[1] - z_max_lay[0]) / (
175+
x_lay[1] - x_lay[0]
176+
)
151177

152178
out = move_along_ray(0.5 * (z_min + z_max), pos, v)
153179
return out

src/openptv_python/ray_tracing.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,26 @@ def ray_tracing(
4444
-------
4545
_type_: _description_
4646
"""
47-
primary_point = np.r_[cal.ext_par.x0, cal.ext_par.y0, cal.ext_par.z0]
48-
glass = np.ascontiguousarray(cal.glass_par)
49-
camera = np.array([x, y, -cal.int_par.cc], dtype=np.float64, order="C")
47+
if hasattr(cal, "get_primary_point"):
48+
primary_point = np.asarray(cal.get_primary_point(), dtype=np.float64)
49+
else:
50+
primary_point = np.r_[cal.ext_par.x0, cal.ext_par.y0, cal.ext_par.z0]
51+
52+
if hasattr(cal, "get_rotation_matrix"):
53+
distortion_matrix = np.asarray(cal.get_rotation_matrix(), dtype=np.float64)
54+
else:
55+
distortion_matrix = np.asarray(cal.ext_par.dm, dtype=np.float64)
56+
57+
if hasattr(cal, "get_glass_vec"):
58+
glass = np.ascontiguousarray(cal.get_glass_vec())
59+
else:
60+
glass = np.ascontiguousarray(cal.glass_par)
61+
62+
camera_cc = float(primary_point[2]) if primary_point.shape[0] >= 3 else float(cal.int_par.cc)
63+
camera = np.array([x, y, -camera_cc], dtype=np.float64, order="C")
5064
return fast_ray_tracing(
5165
camera,
52-
cal.ext_par.dm,
66+
distortion_matrix,
5367
primary_point,
5468
glass,
5569
mm.d[0],

src/openptv_python/segmentation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from numba import njit
66
from scipy.ndimage import center_of_mass, gaussian_filter, label, maximum_filter
77

8-
from ._native_compat import native_target_recognition, should_use_native
8+
from ._native_compat import HAS_NATIVE_SEGMENTATION, native_target_recognition, should_use_native
99
from ._native_convert import (
1010
from_native_target_array,
1111
to_native_control_par,

src/pyptv/legacy_parameters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ def write(self):
765765
f.write("%g\n" % self.dvzmin)
766766
f.write("%g\n" % self.dvzmax)
767767
f.write("%g\n" % self.angle)
768-
f.write("%g\n" % self.dacc)
768+
f.write(f"{self.dacc}\n")
769769
f.write("%d\n" % self.flagNewParticles)
770770
f.close()
771771
return True

0 commit comments

Comments
 (0)