Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / YUYV -> RGB24 / 7 сообщений из 7, страница 1 из 1
12.12.2012, 21:16
    #38076621
Devider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
YUYV -> RGB24
Пытаюсь сделать сабж таким образом:
Код: plaintext
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.
59.
60.
61.
62.
static void yuv2rgb(int y, int u, int v, char *r, char *g, char *b) {
	int r1, g1, b1;
	int c = y - 16, d = u - 128, e = v - 128;

	r1 = (298 * c + 409 * e + 128) >> 8;
	g1 = (298 * c - 100 * d - 208 * e + 128) >> 8;
	b1 = (298 * c + 516 * d + 128) >> 8;

	if (r1 > 255)
		r1 = 255;
	if (g1 > 255)
		g1 = 255;
	if (b1 > 255)
		b1 = 255;
	if (r1 < 0)
		r1 = 0;
	if (g1 < 0)
		g1 = 0;
	if (b1 < 0)
		b1 = 0;

	*r = r1;
	*g = g1;
	*b = b1;
}

void yuyv_to_rgb(rgb_ptr buffer_yuyv, rgb_ptr buffer_rgb, int width, int height)
{
	rgb_ptr pixel_16;   // for YUYV
	rgb_ptr pixel_24;	// for RGB
	int y, u, v, y2;
	char r, g, b;
	if ( buffer_yuyv == NULL || buffer_rgb == NULL)
	return;

	pixel_16 = (rgb_ptr)buffer_yuyv; //width * height * 2
	pixel_24 = buffer_rgb;	//width * height * 3

	int i = 0, j = 0;
	while ((i + 2) < height * width * 2)
	{
		v = pixel_16[i];
		y = pixel_16[i+1];
		u = pixel_16[i+2];
		y2 = pixel_16[i+3];

		yuv2rgb(y, u, v, &r, &g, &b);// 1st pixel

		pixel_24[j] = r;
		pixel_24[j + 1] = g;
		pixel_24[j + 2] = b;
		j+=BPP_RGB24;

		yuv2rgb(y2, u, v, &r, &g, &b);// 2nd pixel

		pixel_24[j] = r;
		pixel_24[j + 1] = g;
		pixel_24[j + 2] = b;
		j+=BPP_RGB24;
		i += BPP_YUY2;
	}
}


А получается какая-то фигня...
...
Рейтинг: 0 / 0
12.12.2012, 21:16
    #38076622
Devider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
YUYV -> RGB24
Собственно, а вот сама фигня
...
Рейтинг: 0 / 0
12.12.2012, 23:19
    #38076786
Devider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
YUYV -> RGB24
Все, разобрался, надо внимательнее читать спеки.
...
Рейтинг: 0 / 0
13.12.2012, 12:31
    #38077407
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
YUYV -> RGB24
Прикрепи пожалуйста исправленный исходник. Люди по форуму искать будут и всё равно попросят решение.
...
Рейтинг: 0 / 0
13.12.2012, 15:32
    #38077944
Devider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
YUYV -> RGB24
В моем случае отца русской (YUYV) демократии спасло следующее:
Код: plaintext
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.
static const int BPP_YUY2 = 2;
static const int BPP_YUY2_PIXEL = 4;
static const int BPP_RGB24 = 3;

char clip(int x){
	//return x > 255 ? x : x < 0 ? 0 : x;
	if (x>255)
		return 255;
	if (x<0)
		return 0;
	return x;
}

static void yuv2rgb(int y, int u, int v, char *r, char *g, char *b) {
	int c = y - 16, d = u - 128, e = v - 128;

	*r = clip(1.164383 * c + 1.596027 * e);
	*g = clip(1.164383 * c - (0.391762 * d) - (0.812968 * e));
	*b = clip(1.164383 * c + 2.017232 * d);

}

void yuyv_to_rgb(rgb_ptr buffer_yuyv, rgb_ptr buffer_rgb, int width, int height)
{
	rgb_ptr pixel_16;   // for YUYV
	rgb_ptr pixel_24;// for RGB
	int y0, u0, v0, y1;
	char r, g, b;
	if ( buffer_yuyv == NULL || buffer_rgb == NULL)
	return;

	pixel_16 = (rgb_ptr)buffer_yuyv;//width * height * 2
	pixel_24 = buffer_rgb;//width * height * 3

	int i = 0, j = 0;
	while ((i + 2) < height * width * 2)
	{
		y0 = pixel_16[i];
		u0 = pixel_16[i+1];
		y1 = pixel_16[i+2];
		v0 = pixel_16[i+3];

		yuv2rgb(y0, u0, v0, &r, &g, &b);	// 1st pixel

		pixel_24[j] = r;
		pixel_24[j + 1] = g;
		pixel_24[j + 2] = b;
		j+=BPP_RGB24;

		yuv2rgb(y1, u0, v0, &r, &g, &b);// 2nd pixel

		pixel_24[j] = r;
		pixel_24[j + 1] = g;
		pixel_24[j + 2] = b;
		j+=BPP_RGB24;
		i += BPP_YUY2_PIXEL;
	}
}
...
Рейтинг: 0 / 0
13.12.2012, 15:37
    #38077954
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
YUYV -> RGB24
ОК. Спасибо. Тему закрываем?
...
Рейтинг: 0 / 0
13.12.2012, 16:58
    #38078166
Devider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
YUYV -> RGB24
mayton,

Ога.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / YUYV -> RGB24 / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]