Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как сделать, чтобы у картинки был формат RGB565?


Автор: =Женек= 1.5.2015, 07:27
Господа, кидаю на форму Image.

Далее из массива заполняю канву
Код

Image1->Picture->Bitmap->PixelFormat=pf16bit; // подготавливаем Image1 к тому, что будет грузиться 8 битная информация.

memset(&bitmap_info, 0, sizeof(bitmap_info));
bitmap_info.bmiHeader.biSize = sizeof(bitmap_info.bmiHeader);
bitmap_info.bmiHeader.biWidth = 640;
bitmap_info.bmiHeader.biHeight = 480;
bitmap_info.bmiHeader.biPlanes = 1;
bitmap_info.bmiHeader.biBitCount = 16;//bits per pixel
bitmap_info.bmiHeader.biCompression = DIB_RGB_COLORS;

SetDIBits(Image1->Canvas->Handle,Form1->Image1->Picture->Bitmap->Handle,0,Image1->Height,&DataIn,&bitmap_info,DIB_RGB_COLORS); 


Источник данных в массиве - сигнал с камеры. Получаю неадекватную по цветам картинку. Долгие эксперименты показали, что если настроить камеру на выдачу сигнала RGB555, а не 565, то цвета правильные. То есть буфер декодируется как RGB555.

Как перенастроить?

Автор: SVN74 2.5.2015, 21:31
Если Вам просто надо смотреть на себя в камеру используйте просто "capPreview" с указанием места (панели) в GDI, кстати там же можно и получить всю картинку как RGB.
А если Вам нужно выполнить более сложную задачу (захват кадра -> упаковка -> передача -> распаковка -> отображение), то  нужно задействовать функцию "ICCompress" для которой у всех камер идет стандартный захват (YUV поток)  для дальнейшей упаковки, Вы конечно можете перевернуть его в RGB формат, но тут начнутся проблемы совместимости вашей программы с другими камерами, - далеко не все камеры поддерживают захват в RGB. Далее упакованный поток вы сможете с легкостью распаковать в RGB с помощью функции "ICDecompress"...   

Автор: =Женек= 3.5.2015, 08:10
ниче не понял..
За альтернативный путь спасибо, но вы можете мне объяснить именно то, о чем я спросил?

Автор: Pavia 3.5.2015, 09:42
=Женек=, 
Цитата(=Женек= @  1.5.2015,  07:27 Найти цитируемый пост)
Как перенастроить?

Считайте, что это физическое ограничения, данной интегральной схемы камеры. И поменять вы их не сможете кроме как перепаять транзисторы в чипе. Берите поток по умолчанию. А после декодируйте в нужный вам формат. 

Во-вторых так вопрос не задают.  Что за камера? Какой библиотекой для захвата пользуетесь?
И самое главное для чего вам нужно перекодировать в такой экзотичный формат? Вообще не понятно что вы хотите получить!

Автор: =Женек= 3.5.2015, 11:41
Да вы не поняли. Камера и чип тут ни при чем. Они генерируют формат, какой скажешь.
Я еще до того как камера приехала экспериментировал - заполнял массив ВРУЧНУЮ в соответствии с форматом RGB565. Просто нарисовал 3 региона - красный, синий, зеленый и отправил буфер по USB. На входе (в софте) проверил - действительно поступившие данные в формате RGB565.
 Вот только цвета были какие-то темные. Я не придал этому значения. И лишь когда полноцветная картинка пошла с искажениями цвета, стал копать.
И накопал, что если камеру настроить на RGB555, или цветовые столбцы забить в массив вручную в формате 555, то картинка отображается как надо. 
Если же массив данных формата RGB565 (а его целостность на входе, то есть в софте компа подтверждена) залить указанным в первом посте кодом на канву, то получаем картинку искаженного цвета.
Иными словами, если я настраиваю камеру в режим 555 и получаю на канве картинку с правильными цветами, то вывод очевиден - канва работает в режиме 555, несмотря на то что я указал 16-ти а не 15-ти битный режим.

Цитата

Что за камера? Какой библиотекой для захвата пользуетесь?

Камера OV7670
Захват аппаратный - DCMI интерфейс контроллера STM32F407
Передача - USB CDC
Прием - свой собственный софт, который принимает буфер и заливает им канву.

Еще раз говорю - именно на заливке канвы проблемы.
Принимаю буфер в котором  пара байт означающих цвет, выглядит 
11111 000000 00000
или 
00000 111111 00000
или 
000000 000000 11111
то есть чистокровные цвета.
Затем заливаю канву и анализирую какого цвета в нем пиксели - получаю что и в красном и в синем и в зеленом основного цвета не на 100 процентов, а есть примеси других составляющих.

Добавлено @ 11:48
Цитата

 Вообще не понятно что вы хотите получить! 

Объясню на пальцах.
Допустим, у меня буфер, состоящий из пикселей только зеленого цвета.
То есть 00000 111111 00000
Иным словами первый байт 0х07, второй 0xE0 - и так весь буфер.

Хочу указанным в первом посте кодом залить этот буфер на канву и получить картинку, сохранив и открыв которую  скажем в фотошопе мы получим спектр 0,255,0, а не 0,198,56  как у меня.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)