docstr: How to use?
  - Create a PixelCoordinatesProjecter instance providing the image_size (You may provide focal length and principal points in NDC or pixel coordinates)
  - Receive points in a 2D array in either NDC or eye coordinates (n, 3), and transform them to pixel coordinates with ndc_2_pixel or eye_2_pixel (n, 2)
  
  Further details:
  http://www.songho.ca/opengl/gl_projectionmatrix.html
  https://google.github.io/mediapipe/solutions/objectron.html#coordinate-systems
code: def __init__(
      self,
      image_size,
      focal_length_ndc=None,
      principal_point_ndc=None,
      focal_length_pixel=None,
      principal_point_pixel=None,
  ):
      """
      How to use?
      - Create a PixelCoordinatesProjecter instance providing the image_size (You may provide focal length and principal points in NDC or pixel coordinates)
      - Receive points in a 2D array in either NDC or eye coordinates (n, 3), and transform them to pixel coordinates with ndc_2_pixel or eye_2_pixel (n, 2)
  
      Further details:
      http://www.songho.ca/opengl/gl_projectionmatrix.html
      https://google.github.io/mediapipe/solutions/objectron.html#coordinate-systems
      """
  
      self.image_size = np.array(image_size)
  
      ndc_params_is_none = all(
          elem is None
          for elem in (focal_length_ndc, principal_point_ndc)
      )
      pixel_params_is_none = all(
          elem is None
          for elem in (focal_length_pixel, principal_point_pixel)
      )
  
      if ndc_params_is_none and not pixel_params_is_none:
          self.focal_length_pixel = focal_length_pixel
          self.principal_point_pixel = principal_point_pixel
          self.compute_ndc_parameters_from_pixel_parameters()
  
      elif pixel_params_is_none and not ndc_params_is_none:
          self.focal_length_ndc = focal_length_ndc
          self.principal_point_ndc = principal_point_ndc
          self.compute_pixel_parameters_from_ndc_parameters()
  
      elif ndc_params_is_none and pixel_params_is_none:
          self.focal_length_ndc = np.array((1.0, 1.0))
          self.principal_point_ndc = np.array((0.0, 0.0))
          self.compute_pixel_parameters_from_ndc_parameters()
      else:
          raise ValueError(
              "You cannot provide parameters in both NDC and pixel coordinates. Choose one."
          )
  
file_path: norfair/demos/3d_track/src/utils.py
imports: import cv2
  import numpy
  from norfair import Palette
label_desc: Use image node_id 1 to create a new PixelCoordinatesProjecter object  with example: obj = PixelCoordinatesProjecter(image_size, focal_length_ndc, principal_point_ndc, focal_length_pixel, principal_point_pixel)