docstr: Project one or more Vector3 from the camera frame into the canonical z=1 plane through perspective
  division.
  
  Args:
      points: Vector3 representing the points to project.
  
  Returns:
      Vector2 representing the projected points.
  
  Example:
      >>> points = Vector3.from_coords(1., 2., 3.)
      >>> Z1Projection().project(points)
      x: 0.3333333432674408
      y: 0.6666666865348816
docstr_tok: ["Project","one","or","more","Vector3","from","the","camera","frame","into","the","canonical","z=1","plane","through","perspective","division",".","Args",":","points",":","Vector3","representing","the","points","to","project",".","Returns",":","Vector2","representing","the","projected","points",".","Example",":",">",">",">","points","=","Vector3.from_coords","(","1.",",","2.",",","3",".",")",">",">",">","Z1Projection","(",")",".project","(","points",")","x",":","0.3333333432674408","y",":","0.6666666865348816"]
code: def project(self, points: Vector3) -> Vector2:
      """Project one or more Vector3 from the camera frame into the canonical z=1 plane through perspective
      division.
  
      Args:
          points: Vector3 representing the points to project.
  
      Returns:
          Vector2 representing the projected points.
  
      Example:
          >>> points = Vector3.from_coords(1., 2., 3.)
          >>> Z1Projection().project(points)
          x: 0.3333333432674408
          y: 0.6666666865348816
      """
      xy = points.data[..., :2]
      z = points.z
      uv = (
          (xy.T @ diag(z).inverse()).T if len(z.shape) else xy.T * 1 / z
      )
      return Vector2(uv)
  
file_path: kornia/kornia/sensors/camera/projection_model.py
imports: from __future__ import annotations
  from kornia.core import Tensor, diag
  from kornia.geometry.vector import Vector2, Vector3
label_desc: Use image node_id 1 for calling the Z1Projection obj's underlying member method code with example usage: obj.project(points) and returns: Vector2