docstr: Tests that the cameras converted from opencv to pulsar convention
  return correct projections of random 3D points. The check is done
  against a set of results precomputed using `cv2.projectPoints` function.
docstr_tok: ["Tests","that","the","cameras","converted","from","opencv","to","pulsar","convention","return","correct","projections","of","random","3D","points",".","The","check","is","done","against","a","set","of","results","precomputed","using","`","cv2.projectPoints","`","function","."]
code: def test_pulsar_conversion(self):
      """
      Tests that the cameras converted from opencv to pulsar convention
      return correct projections of random 3D points. The check is done
      against a set of results precomputed using `cv2.projectPoints` function.
      """
      image_size = [[480, 640]]
      R = [
          [
              [1.0, 0.0, 0.0],
              [0.0, 1.0, 0.0],
              [0.0, 0.0, 1.0],
          ],
          [
              [0.1968, -0.6663, -0.7192],
              [0.7138, -0.4055, 0.5710],
              [-0.6721, -0.6258, 0.3959],
          ],
      ]
      tvec = [
          [10.0, 10.0, 3.0],
          [-0.0, -0.0, 20.0],
      ]
      focal_length = [
          [100.0, 100.0],
          [10.0, 10.0],
      ]
      principal_point = [
          [320, 240],
          [320, 240],
      ]
  
      principal_point, focal_length, R, tvec, image_size = [
          torch.FloatTensor(x)
          for x in (principal_point, focal_length, R, tvec, image_size)
      ]
      camera_matrix = eyes(dim=3, N=2)
      camera_matrix[:, 0, 0] = focal_length[:, 0]
      camera_matrix[:, 1, 1] = focal_length[:, 1]
      camera_matrix[:, :2, 2] = principal_point
      rvec = so3_log_map(R)
      pts = torch.tensor(
          [[[0.0, 0.0, 120.0]], [[0.0, 0.0, 120.0]]],
          dtype=torch.float32,
      )
      radii = torch.tensor([[1e-5], [1e-5]], dtype=torch.float32)
      col = torch.zeros((2, 1, 1), dtype=torch.float32)
  
      # project the 3D points with the opencv projection function
      pts_proj_opencv = cv2_project_points(
          pts, rvec, tvec, camera_matrix
      )
      pulsar_cam = pulsar_from_opencv_projection(
          R, tvec, camera_matrix, image_size, znear=100.0
      )
      pulsar_rend = PulsarRenderer(
          640, 480, 1, right_handed_system=False, n_channels=1
      )
      rendered = torch.flip(
          pulsar_rend(
              pts,
              col,
              radii,
              pulsar_cam,
              1e-5,
              max_depth=150.0,
              min_depth=100.0,
          ),
          dims=(1,),
      )
      for batch_id in range(2):
          point_pos = torch.where(
              rendered[batch_id] == rendered[batch_id].min()
          )
          point_pos = point_pos[1][0], point_pos[0][0]
          self.assertLess(
              torch.abs(point_pos[0] - pts_proj_opencv[batch_id, 0, 0]),
              2,
          )
          self.assertLess(
              torch.abs(point_pos[1] - pts_proj_opencv[batch_id, 0, 1]),
              2,
          )
  
file_path: pytorch3d/tests/test_camera_conversions.py
imports: import json
  import unittest
  import numpy
  import torch
  from pytorch3d.ops import eyes
  from pytorch3d.renderer.points.pulsar import Renderer
  from pytorch3d.transforms import so3_exp_map, so3_log_map
  from pytorch3d.utils import cameras_from_opencv_projection, opencv_from_cameras_projection, pulsar_from_opencv_projection
  from .common_testing import get_tests_dir, TestCaseMixin
label_desc: Use image node_id 4 for calling the TestCameraConversions obj's underlying member method code with example usage: obj.test_pulsar_conversion() without return types