pycvcam.distort_points#
- distort_points(image_points, intrinsic, distortion, R=None, P=None, *, transpose=False, inverse_intrinsic_kwargs=None, distortion_kwargs=None, R_kwargs=None, P_kwargs=None)[source]#
Distort 2D
image_pointsusing the camera intrinsic, distortion transformations to obtain thedistorted_pointsin the normalized coordinate system ortransformed_pointsifRorPare provided.As a reminder,
\[\begin{split}\vec{x}_n = \text{Intrinsic}^{-1}(\vec{x}_i) \\ \vec{x}_d = \text{Distortion}(\vec{x}_n)\end{split}\]Then optionally,
\[\vec{x}_u = P(R(\vec{x}_d)))\]Where:
\(\vec{x}_i\) are the 2D
image_pointsin the image coordinate system \((\vec{e}_x, \vec{e}_y)\).\(\vec{x}_d\) are the 2D
distorted_pointsin the normalized coordinate system \((\vec{I}, \vec{J})\).\(\vec{x}_n\) are the 2D
normalized_pointsin the normalized coordinate system \((\vec{I}, \vec{J})\).\(\vec{x}_u\) are the 2D
transformed_pointsin the space required by the user.
Note
The behavior of the function can be adapted to the user’s needs by providing the appropriate transformations.
Use
intrinsic = Noneto give directly the normalized points in the normalized coordinate system.Use
P = intrinsicto return the distorted points in the image coordinate system.Use
intrinsic = NoneandP = Noneif the distortion model is defined in the image coordinate system.
The given points
image_pointsare assumed to be in the sensor coordinate system and expressed in 2D coordinates with shape (…, 2).Note
The expected
image_pointscan be extracted from thepixel_pointsby swapping the axes.- Parameters:
image_points (ArrayLike) – The 2D image points in the image coordinate system. Shape (…, 2)
intrinsic (Optional[
Intrinsic]) – The intrinsic transformation to be applied to the image points. If None, a no intrinsic transformation is applied (i.e., identity transformation).distortion (Optional[
Distortion]) – The distortion model to be applied to the normalized points. If None, a no distortion transformation is applied (i.e., identity transformation).R (Optional[
Extrinsic], optional) – The rectification extrinsic transformation (rotation and translation) to be applied to the distorted points. If None, a no extrinsic transformation is applied (i.e., identity transformation). Default is None.P (Optional[
Intrinsic], optional) – The projection intrinsic transformation to be applied to the distorted points. If None, a no intrinsic transformation is applied (i.e., identity transformation). This is useful to return the distorted points in the image coordinate system.transpose (bool, optional) – If True, the input points are assumed to be in the shape (2, …) instead of (…, 2). Default is False. The output points will be in the same shape as the input points.
inverse_intrinsic_kwargs (Optional[Dict], optional) – Additional keyword arguments to be passed to the intrinsic inverse transformation (
intrinsic._inverse_transform). Default is None.distortion_kwargs (Optional[Dict], optional) – Additional keyword arguments to be passed to the distortion transformation (
distortion._transform). Default is None.R_kwargs (Optional[Dict], optional) – Additional keyword arguments to be passed to the rectification extrinsic transformation (
R._transform). Default is None.P_kwargs (Optional[Dict], optional) – Additional keyword arguments to be passed to the projection intrinsic transformation (
P._transform). Default is None.
- Returns:
The 2D distorted points in the normalized coordinate system with shape (…, 2) or the 2D transformed points in the user coordinate system if
PorRare given.- Return type:
See also
pycvcam.undistort_pointsSimilar to this function but applies the transformations in the opposite direction to undistort the points instead of distorting them.
pycvcam.distort_imageDistort an image using the camera intrinsic and distortion transformations.
pycvcam.project_pointsProject 3D points to 2D image points using the camera intrinsic, distortion, and extrinsic transformations.
Example
The following example shows how to distort 2D image points using the intrinsic camera matrix and a distortion model.
import numpy from pycvcam import undistort_points, Cv2Distortion, Cv2Intrinsic # Define the 2D image points in the camera coordinate system image_points = numpy.array([[320.0, 240.0], [420.0, 440.0], [520.0, 540.0], [620.0, 640.0], [720.0, 740.0]]) # shape (5, 2) # Define the intrinsic camera matrix K = numpy.array([[1000.0, 0.0, 320.0], [0.0, 1000.0, 240.0], [0.0, 0.0, 1.0]]) # Create the intrinsic object intrinsic = Cv2Intrinsic.from_matrix(K) # Define the distortion model (optional) distortion = Cv2Distortion([0.1, 0.2, 0.3, 0.4, 0.5]) # Undistort the 2D image points normalized_points = undistort_points( image_points, intrinsic=intrinsic, distortion=distortion )
To return the undistorted points in the image coordinate system, you can provide a projection P equal to the intrinsic K:
undistorted_points = undistort_points( image_points, intrinsic=intrinsic, distortion=distortion, P=intrinsic )