def METHOD_NAME(self) -> Optional[np.ndarray]:
    if self.last_panel_points_msg is None:
        return None
    try:
        transform = self.tf_buffer.lookup_transform_full(
            self.sub.last_image_header.frame_id,
            self.sub.last_image_header.stamp,
            self.last_panel_points_msg.header.frame_id,
            self.last_panel_points_msg.header.stamp,
            "enu",
            timeout=rospy.Duration(1),
        )
    except tf2_ros.TransformException as e:
        rospy.logwarn(e)
        return None
    transformed_cloud = do_transform_cloud(self.last_panel_points_msg, transform)
    points = np.array(
        list(
            sensor_msgs.point_cloud2.read_points(transformed_cloud, skip_nans=True),
        ),
    )
    if len(points) < 4:
        rospy.logwarn("less than 4 points")
        return None
    if self.camera_model is None:
        rospy.logwarn("no camera model")
        return None
    roi = roi_enclosing_points(self.camera_model, points)
    if roi is None:
        rospy.logwarn("No points project into camera.")
        return None
    rect = rect_from_roi(roi)
    upper_left, bottom_right = rect
    xmin, ymin = upper_left
    xmax, ymax = bottom_right
    x_shrink_pixels = 15
    y_shrink_pixels = x_shrink_pixels
    xmin += x_shrink_pixels
    xmax -= x_shrink_pixels
    ymin += y_shrink_pixels
    ymax -= y_shrink_pixels
    new_rect = ((xmin, ymin), (xmax, ymax))
    bbox_contour = bbox_countour_from_rectangle(new_rect)
    return bbox_contour