code: def keypoint_rotate(keypoint, angle, rows, cols, **params):
      """Rotate a keypoint by angle.
  
      Args:
          keypoint (tuple): A keypoint `(x, y, angle, scale)`.
          angle (float): Rotation angle.
          rows (int): Image height.
          cols (int): Image width.
  
      Returns:
          tuple: A keypoint `(x, y, angle, scale)`.
  
      """
      center = (cols - 1) * 0.5, (rows - 1) * 0.5
      matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
      x, y, a, s = keypoint[:4]
      x, y = cv2.transform(np.array([[[x, y]]]), matrix).squeeze()
      return x, y, a + math.radians(angle), s
  
imports: import math
  from typing import List, Optional, Sequence, Tuple, Union
  import cv2
  import numpy
  import skimage.transform
  from scipy.ndimage import gaussian_filter
  from albumentations.augmentations.utils import _maybe_process_in_chunks, angle_2pi_range, clipped, preserve_channel_dim, preserve_shape
  from ...None import random_utils
  from ...core.bbox_utils import denormalize_bbox, normalize_bbox
  from ...core.transforms_interface import BoxInternalType, FillValueType, ImageColorType, KeypointInternalType
label_desc: Use image node_id 5 for calling a global function with example usage: keypoint_rotate(keypoint, angle, rows, cols) and returns: x,  y,  unknown,  s