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>