Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/48: Рейтинг темы: голосов - 48, средняя оценка - 4.90
3 / 3 / 2
Регистрация: 06.06.2014
Сообщений: 95
1

Преобразование визуальных данных из формата RGB в YUV (4:2:0)

13.02.2015, 14:41. Показов 8668. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, добрые люди.
При создании программы преобразовании визуальных данных из формата RGB в YUV наткнулся на проблему в участке кода отвечающий за преобразование 4:2:0 (это дискретизация изображения, где на каждые четыре пикселя яркости приходится два пикселя цветности).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//Участок кода преобразования 4:2:0
int R,G,B;
//создание динамических массивов U1 и V1
BYTE* biImage;
int **U1; U1=new int*[H]; for(j=0; j<H; j++) U1[j]=new int[W];
int **V1; V1=new int*[H]; for(j=0; j<H; j++) V1[j]=new int[W];
//преобразование 4:2:0
for(i=0; i<H; i=i+2)
   {
for(j=0; j<W; j=j+2)
   {
U1[i/2][j/2]=(U[i][j]+U[i+1][j]+U[i][j+1]+U[i+1][j+1])/4;
V1[i/2][j/2]=(V[i][j]+V[i+1][j]+V[i][j+1]+V[i+1][j+1])/4;
     }
    }
//интерполяция
for(i=0; i<H; i=i+2)
   {
for(j=0; j<W; j=j+2)
  {
//восстановление U
U[i][j]=U1[i/2][j/2]; U[i+1][j]=U1[i/2][j/2];
U[i][j+1]=U1[i/2][j/2]; U[i+1][j+1]=U1[i/2][j/2];
//восстановление V
V[i][j]=V1[i/2][j/2]; V[i+1][j]=V1[i/2][j/2];
V[i][j+1]=V1[i/2][j/2]; V[i+1][j+1]=V1[i/2][j/2];
     }
   }
//преобразование YUV в RGB
for(i=0; i<H; i++)
  {
biImage=(BYTE*)(Form1->Image2)->Picture->Bitmap->ScanLine[i];
for(j=0; j<W; j++)
  {
//красный R
R = Y[i][j] + 1.13983 * (V[i][j] - 128);
if(R>255) R=255; if(R<0) R=0;
//зеленый G
G = Y[i][j] - 0.39465 * (U[i][j] - 128) - 0.58060 * (V[i][j] - 128);
if(G>255) G=255; if(G<0) G=0;
//синий B
B = Y[i][j] + 2.03211 * (U[i][j] - 128);
if(B>255) B=255; if(B<0) B=0;
//восстановление массива изображения
biImage[j*3+2]= R;
biImage[j*3+1]= G;
biImage[j*3] = B;
    }
  }
//обновление изображения на экране
Form1->Image2->Refresh();
//удаление массивов
for(j=0; j<H; j++)
   {
delete[] Y[j];
delete[] U[j]; delete[] V[j];
delete[] U1[j]; delete[] V1[j];
  }
При компиляции этого кода высвечивается ошибка "E2451 Undefined symbol 'U' и то же самое с 'Y' и 'V'.
Пытался их обозначить как переменные с типом int, но появляется другая ошибка "E2062 Invalid indirection".
Подскажите, как правильно сделать только недавно C++Bulder осваиваю.
Вложения
Тип файла: rar Пример моей программы.rar (23.5 Кб, 89 просмотров)
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2015, 14:41
Ответы с готовыми решениями:

Оптимизация RGB->YUV
Вот такая простая задачка как перевод картинки из RGB в YUV формат. Начальный вариант был в &quot;лоб&quot;...

Graphics: YUV -> RGB conversion
Ктo-тo мoзет пoдскaзaтъ или пoкaзaтъ кoд? Сусчествуыет мнoгo фoрмул, врoде: r = (1.164 * (ы...

Заголовок видеофайла формата .yuv
Добрый день. Возникла проблема с видеофайлом формата .yuv. Необходимо наложить на каждый кадр...

Access 2007. Преобразование текстового формата данных в числовой.
Уважаемые специалисты, помогите пожалуйста решить такую вот задачу:Имеется таблица с полями...

5
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
13.02.2015, 16:01 2
Цитата Сообщение от WolfEater Посмотреть сообщение
int **U1; U1=new int*[H]; for(j=0; j<H; j++) U1[j]=new int[W]; int **V1; V1=new int*[H]; for(j=0; j<H; j++) V1[j]=new int[W];
Массивы U1 и V1 вы объявили и выделили под них память. Аналогично надо сделать для массивов U и V
0
3 / 3 / 2
Регистрация: 06.06.2014
Сообщений: 95
13.02.2015, 16:05  [ТС] 3
mimicria
Пытался уже так делать программа, конечно, компилируется и запускается только вот не правильно обрабатывает изображение 4:2:0 вместо обработанного изображения он выдает цветную кашу.
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
13.02.2015, 17:58 4
Цитата Сообщение от WolfEater Посмотреть сообщение
только вот не правильно обрабатывает
Это уже другой вопрос, что вы обрабатываете и как, насколько корректно преобразование.
0
3 / 3 / 2
Регистрация: 06.06.2014
Сообщений: 95
13.02.2015, 18:11  [ТС] 5
mimicria
Могу также пример показать что получилось. По идее преобразование 4:2:0 не должен сильно менять картинку от оригинала. Но в итоге получается чёрти что.
Миниатюры
Преобразование визуальных данных из формата RGB в YUV (4:2:0)  
1
случайный прохожий
2948 / 1959 / 607
Регистрация: 20.07.2013
Сообщений: 5,174
14.02.2015, 01:25 6
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Использовал обычные преобразования
https://ru.wikipedia.org/wiki/YUV
и делал попиксельно.
Под 4:2:0 попробуй сам переделать, формулы у тебя вроде какие-то есть.
Ограничения по коду: картинка должна иметь тип bmp и помещаться в область Image (иметь такие же размеры).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  TColor tempColor;
  Byte R, G, B;
  int Y, U, V;
  for (int i = 1; i <= Image1->Width; i++)
    for (int j = 1; j <= Image1->Height; j++)
    {
      tempColor = Image1->Canvas->Pixels[i][j];
      R = GetRValue(tempColor);
      G = GetGValue(tempColor);
      B = GetBValue(tempColor);
 
      Y = 0.299 * R + 0.587 * G + 0.114 * B;
      U = -0.14713 * R - 0.28886 * G + 0.436 * B + 128;
      V = 0.615 * R - 0.51499 * G - 0.10001 * B + 128;
 
      Image2->Canvas->Pixels[i][j] = (TColor) RGB(Y, U, V);
    }
Преобразование визуальных данных из формата RGB в YUV (4:2:0)



Другие варианты:

YVU
Преобразование визуальных данных из формата RGB в YUV (4:2:0)


UYV
Преобразование визуальных данных из формата RGB в YUV (4:2:0)


UVY
Преобразование визуальных данных из формата RGB в YUV (4:2:0)


VYU
Преобразование визуальных данных из формата RGB в YUV (4:2:0)


VUY
Преобразование визуальных данных из формата RGB в YUV (4:2:0)
1
14.02.2015, 01:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2015, 01:25
Помогаю со студенческими работами здесь

Изменение цветового формата с rgb на cmyk
Здравствуйте, никак не могу преобразовать цветовой формат в картинке (Bitmap), в пробовал...

Сохранение RGB изображения после преобразования в файл *.bmp формата
Вот такая ситуация у меня: Есть bmp рисунок и мне нужно сделать с него 24-битную картинку. ...

Реализовать конвертер оттенка цвета из формата RGB (кодированный тремя байтами) в формат HTML
Любой цвет можно определить компонентами r, g, b - красный, зеленый, синий. В зависимости от того,...

Преобразование из YCbCr в RGB
ЧЯДнТ? Формула? Код? Цветовое пространство? :help: #define BYTE uchar void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru