NV12toRGB

Versioned name: NV12toRGB-8

Category: Image processing

Short description: NV12toRGB performs image conversion from NV12 to RGB format.

Detailed description:

Conversion of each pixel from NV12 (YUV) to RGB space is represented by the following formulas:

\[\begin{split}\begin{aligned} & R = 1.164 \cdot (Y - 16) + 1.596 \cdot (V - 128) \\ & G = 1.164 \cdot (Y - 16) - 0.813 \cdot (V - 128) - 0.391 \cdot (U - 128) \\ & B = 1.164 \cdot (Y - 16) + 2.018 \cdot (U - 128) \end{aligned}\end{split}\]

Then R, G, B values are clipped to range (0, 255).

Inputs:

Input NV12 image tensor shall have NHWC (also known as NYXC) layout and can be represented in two ways:

  • Single plane:

    • 1: Tensor of type T. Required. Dimensions:

      • N - batch dimension

      • H - height dimension is 1.5x bigger than the image height

      • W - width dimension is the same as the image width

      • C - channels dimension is equal to 1 (one plane)

  • Two separate planes - Y and UV:

    • 1: Tensor of type T representing Y plane. Required. Dimensions:

      • N - batch dimension

      • H - height dimension is the same as the image height

      • W - width dimension is the same as the image width

      • C - channels dimension is equal to 1 (only Y channel)

    • 2: Tensor of type T representing UV plane. Required. Dimensions:

      • N - batch dimension. Shall be the same as the batch dimension for Y plane

      • H - height dimension shall be half of the image height (for example, image_height / 2)

      • W - width dimension shall be half of the image width (for example, image_width / 2)

      • C - channels dimension shall be equal to 2 (U channel and V channel)

Outputs:

  • 1: A tensor of type T representing an image converted in RGB format. Dimensions:

    • N - batch dimension

    • H - height dimension is the same as the image height

    • W - width dimension is the same as the image width

    • C - channels dimension is equal to 3. The first channel is Red, the second one is Green, the last one is Blue

Types:

  • T: uint8 or any supported floating-point type.

Examples:

Example 1

 <layer ... type="NV12toRGB">
     <input>
         <port id="0">
             <dim>1</dim>
             <dim>720</dim>
             <dim>640</dim>
             <dim>1</dim>
         </port>
     </input>
     <output>
         <port id="1">
             <dim>1</dim>
             <dim>480</dim>
             <dim>640</dim>
             <dim>3</dim>
         </port>
     </output>
 </layer>

Example 2

 <layer ... type="NV12toRGB">
     <input>
         <port id="0">  <!-- Y plane -->
             <dim>1</dim>
             <dim>480</dim>
             <dim>640</dim>
             <dim>1</dim>
         </port>
         <port id="1">  <!-- UV plane -->
             <dim>1</dim>
             <dim>240</dim>
             <dim>320</dim>
             <dim>2</dim>
         </port>
     </input>
     <output>
         <port id="1">
             <dim>1</dim>
             <dim>480</dim>
             <dim>640</dim>
             <dim>3</dim>
         </port>
     </output>
 </layer>