class_docstr: texture_atlas: An image, size 6N * 4N, with N * N squares for each of the 24 body parts.
          It must follow the grid found at https://github.com/facebookresearch/DensePose/blob/master/DensePoseData/demo_data/texture_atlas_200.png  # noqa
          For each body part, U is proportional to the x coordinate, and (1 - V) to y
code: def generate_image_with_texture(
      self, texture_image, alpha, bbox_image_bgr, iuv_array
  ):
      I, U, V = iuv_array
      generated_image_bgr = bbox_image_bgr.copy()
  
      for PartInd in range(1, 25):
          x, y = np.where(I == PartInd)
          x_index = (U[x, y] * (self.body_part_size - 1)).astype(int)
          y_index = ((1 - V[x, y]) * (self.body_part_size - 1)).astype(
              int
          )
          part_alpha = np.expand_dims(
              alpha[PartInd - 1, y_index, x_index], -1
          )
          generated_image_bgr[I == PartInd] = (
              generated_image_bgr[I == PartInd] * (1 - part_alpha)
              + texture_image[PartInd - 1, y_index, x_index]
              * part_alpha
          )
  
      return generated_image_bgr.astype(np.uint8)
  
file_path: detectron2/projects/DensePose/densepose/vis/densepose_results_textures.py
imports: import numpy
  from typing import List, Optional, Tuple
  import torch
  from detectron2.data.detection_utils import read_image
  from ..structures import DensePoseChartResult
  from .base import Boxes, Image
  from .densepose_results import DensePoseResultsVisualizer
label_desc: Use image node_id 4 for calling the DensePoseResultsVisualizerWithTexture obj's underlying member method code with example usage: obj.generate_image_with_texture(texture_image, alpha, bbox_image_bgr, iuv_array) and returns: generated_image_bgr