2012-06-27 4 views
2

В OpenGL ES 2.0 после считывания фреймбуфера и преобразования его в рамки RGBA. Я хочу преобразовать его в формат YUV.преобразование формата

Я пробовал использовать это table. Который игнорирует альфа-компонент. Когда я делаю это и вижу, что кадр YUV сгенерировал его искаженное.

Может кто-нибудь мне помочь, пожалуйста

yuvdata[i * j *1]= (0.257)*memory[i*j*1] + (0.504)*memory[i*j*2]+(0.098)*memory[i*j*3]+16; 
yuvdata[i * j *3]= (0.439)*memory[i*j*1] - (0.368)*memory[i*j*2] -(0.071)*memory[i*j*3]+128; 
yuvdata[i * j *2]= -(0.148)*memory[i*j*1] - (0.291)*memory[i*j*2] +(0.439)*memory[i*j*3]+128; 

`

Нормализация не помогло памяти хранить RGBA и YUV свободное пространство для хранения YUV

я использовал RGB для YUV преобразования пренебрегая альфа компонент

Друзья эта проблема решена. Эта статья замечательна yuv2rgb. Спасибо Viktor Latypov и Mārtiņš Možeiko

+0

оскорбительный код – Indy9000

+0

@ Kip9000 Я добавил код. –

+1

Есть YUV420p, YUV411, YUV422 и YUV444. Первые три должны быть преобразованы в YUV444 перед применением матрицы. Каков точный формат YUV, который вы хотите использовать? –

ответ

1

«ЮВ» не является полным форматом.

С this wikipedia article вы можете получить конверсии YUV411, YUV422, YUV420p в YUV444. Объедините инверсию этих преобразований с преобразованием RGB, и вы получите результат.

То, что вам не хватает: одна тройка RGB может создавать число (не одно) компонентов YUV таким образом.

  1. YUV444 3 байта на пиксель
  2. YUV422 4 байта на 2 пикселей
  3. YUV411 6 байт на 4 пикселя
  4. YUV420p 6 байт на 4 пикселя, заказана

Во-первых, YUV422

Y'UV422 - RGB888 преобразование

Входной сигнал: Read 4 байта Y'UV (и, у1, v, у2)

Выход: Запись 6 байт RGB (R, G, B, R, G, B)

Тогда YUV4111

Y'UV411 конверсии RGB888

ввода: читать 6 байт Y'UV

Выход: Записывает 12 байт RGB

// Extract YUV components 
u = yuv[0]; 
y1 = yuv[1]; 
y2 = yuv[2]; 
v = yuv[3]; 
y3 = yuv[4]; 
y4 = yuv[5]; 
rgb1 = Y'UV444toRGB888(y1, u, v); 
rgb2 = Y'UV444toRGB888(y2, u, v); 
rgb3 = Y'UV444toRGB888(y3, u, v); 
rgb4 = Y'UV444toRGB888(y4, u, v); 

Аналогично 420p, но значения YUV распределены по прямоугольнику там - см. Диаграмму и изображение Википедии для этого.

В принципе, вы должны выбрать 4 RGB-пикселя, конвертировать каждый из них в YUV (используя надежно действующий 444-конвертер), а затем сохранить массив YUV [4] сложным способом, показанным в википедии.

+0

В моем случае я взял компоненты RGB и преобразован в YUV444. Теперь я конвертирую в YUV 420. Этот ответ мне очень помог :) –

0

Вы уверены, что имеете доступ к массиву памяти правильно? Разве это не должно быть примерно так:

R=memory[(i*width + j)*4+0] 
G=memory[(i*width + j)*4+1] 
B=memory[(i*width + j)*4+3] 

или своп 0 с 3, если у вас есть BGRA.

+0

@Martin Я изменил память, к которой я обращаюсь, +0 +1 +3, но результат такой же .. –

+0

Невозможно, чтобы результат был тот же! –

+0

@Martins Спасибо. Я был неправ. :) после этого моя проблема была связана с типом данных. Я решил это. Еще раз спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^