Как повернуть данные yuv420? - PullRequest
1 голос
/ 29 июня 2010

Мне нужно знать, как повернуть изображение в формате yuv420p на 90 градусов. Возможность преобразования этого значения в rgb, вращения и повторного преобразования в yuv невозможна. Даже алгоритм поможет.

С уважением, Anirudh.

Ответы [ 3 ]

1 голос
/ 04 апреля 2012

Если изображение yuv420 плоское, это то, как кодируются данные изображения. Планарное значение означает сначала раздел y, затем раздел U и затем раздел V.

Учитывая ширину изображения w и высоту изображения h.

  1. Общий размер изображения - ш * ч * 3/2

  2. Секция Y, также называемая люминесценцией, занимает ш * ч.

  3. для каждого блока 2x2 в секции Y есть пиксель U и V пиксель.

  4. секция U идет следующей, занимает (w / 2) * (h / 2) и располагается со смещением w * h от начала изображения.

  5. раздел V следует, занимает (w / 2) * (h / 2) и укладывается со смещением (w * h) + ((w * h) / 4).

Чтобы повернуть изображение на 90 градусов, необходимо скопировать этот массив w * h в массив h * w

Как уже упоминалось в посте выше, вам просто нужно скопировать каждый из 3-х вышеуказанных блоков Y, U, V. отдельно.

  1. Начните с раздела Y. 1-й пиксель, который нужно скопировать, имеет значение (h-1) * w в массиве источников, скопируйте его в (0,0) целевого массива. 2-й пиксель имеет значение (h-2) * w и т. Д. ...

  2. Помните, что секции U и V только (w / 2) * (h / 2)

  3. Затем скопируйте раздел U. Первый пиксель, который будет скопирован, находится в (w * h) + (((h / 2) -1) * (w / 2)) в массиве источников, скопируйте его в (h * w) + (0,0) в Массив назначения. 2-й пиксель имеет значение (w * h) + (((h / 2) -2) * (w / 2)) и т. Д. ...

  4. Наконец, скопируйте раздел V. Первый пиксель, который нужно скопировать, находится в ((w * h) + (w * h / 4)) + (((h / 2) -1) * (w / 2)) в массиве источников, скопируйте его в (h * w) + (w * h / 4) + (0,0) в массиве назначения. 2-й пиксель имеет значение ((w * h) + (w * h / 4)) + (((h / 2) -2) * (w / 2)) и т. Д. ...

Полученный таким образом массив получателей содержит повернутое на 90 градусов изображение.

1 голос
/ 29 июня 2010

Полагаю, это не планарное YUV , если это уже достаточно просто (пропустите первый и последний шаги).Вы хотели иметь плоскость YUV 4: 2: 0, но тогда я не понимаю, почему у вас возникают трудности.

  1. сначала преобразуйте ее в плоскую: выделите место для плоскостей и расположите байты в нужных местах согласнов упакованном формате YUV , который у вас есть.
  2. вращайте плоскости Y, U, V отдельно.Информация о «цвете» (U, V) для каждого блока должна оставаться неизменной.
  3. рекомбинирует плоскости, чтобы восстановить право упакованного YUV , которое вы имели в начале

Это всегда хорошо работает, если размеры вашего изображения кратны 4. Если нет, то позаботьтесь ...

0 голосов
/ 29 июня 2010

Я думаю, что YUV420p действительно плоский.

Попробуйте взглянуть на исходный код AviSynth.Функции поворота (поворота) представлены в файлах turn.cpp и turnfunc.cpp

http://www.avisynth.org/

...