Source code for fluidimage.calibration.calib2d_simple
"""Simple 2D calibration
========================
.. autoclass:: Calibration2DSimple
:members:
:private-members:
"""
import numpy as np
from fluiddyn.io.image import imread
[docs]class Calibration2DSimple:
"""Simple 2D calibration
The hypothesis are (at least):
- No rotation (x and y remains x and y).
- No optical aberration.
- Everything orthogonal (the camera points directly toward the laser plan).
Parameters
----------
point0: sequence of size 2
The coordinates in pixel of a first point as (indy, indx).
point1: sequence of size 2
The coordinates in pixel of a first point as (indy, indx).
distance: number
The distance between the 2 points in physical unit.
aspect_ratio_pixel: number
The aspect ratio of 1 pixel (a characteristic of the camera) as
yphys1pxel/xphys1pxel.
shape_image: sequence of size 2 (optional)
The shape of the image. If it is not given, the next argument
(`path_image`) is used.
path_image: str (optional)
The path toward the image (used to get the shape of the image).
point_reference: sequence of size 2 (optional, default=(0, 0))
A point for which (yphys, xphys) = orig_phys
orig_phys: sequence of size 2 (optional, default=(0., 0.))
The coordinates in physical unit of the point origin.
"""
def __init__(
self,
point0,
point1,
distance,
aspect_ratio_pixel=1.0,
shape_image=None,
path_image=None,
point_origin=(0, 0),
orig_phys=(0.0, 0.0),
):
self.point0 = np.array(point0)
self.point1 = np.array(point1)
self.distance = distance
delta_point = self.point1 - self.point0
self.aspect_ratio_pixel = aspect_ratio_pixel
self.xphys1pixel = distance / np.sqrt(
delta_point[0] ** 2 + (aspect_ratio_pixel * delta_point[1]) ** 2
)
self.yphys1pixel = aspect_ratio_pixel * self.xphys1pixel
if shape_image is None:
arr = imread(path_image)
shape_image = arr.shape
self.shape_image = shape_image
self.ix_origin = point_origin[1]
self.iy_origin = point_origin[0]
self.xphys_origin = orig_phys[1]
self.yphys_origin = orig_phys[0]
[docs] def pix2phys(self, ixs, iys):
"""Calcul physical coordinates from indices.
Parameters
----------
ixs: number or np.array
Indices in the x direction (second dimension).
iys: number or np.array
Indices in the y direction (first dimension).
"""
xphys = self.xphys_origin + self.xphys1pixel * (ixs - self.ix_origin)
yphys = self.yphys_origin + self.yphys1pixel * (iys - self.iy_origin)
return xphys, yphys
[docs] def displ2phys(self, ixs, iys, displxs, displys):
"""Calcul physical coordinates and physical displacements from indices.
Parameters
----------
ixs: number or np.array
Indices in the x direction (second dimension).
iys: number or np.array
Indices in the y direction (first dimension).
displxs: number or np.array
Displacements in the x direction (in pixels)
displys: number or np.array
Displacements in the y direction (in pixels)
"""
xphys, yphys = self.pix2phys(ixs, iys)
displ_phys_xs = self.xphys1pixel * displxs
displ_phys_ys = self.yphys1pixel * displys
return xphys, yphys, displ_phys_xs, displ_phys_ys