5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
1

Как принять/передать изображение по порту (COM/USB)?

23.03.2012, 15:04. Показов 4957. Ответов 21
Метки нет (Все метки)

Задача довольно сложная, нужно принимать, обрабатывать и выводить изображения в реальном времени чтобы это выглядело как видео. Приниматься данные будут по кадрам через порт в двоичной системе.
Мне интересно узнать как будет выглядеть рисунок .bmp в двоичном коде и как его перевести.
Для начала нужно калибровать устройство, надо отсылать, а потом принимать и выводить 1 рисунок.

Help me, PLEASE!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2012, 15:04
Ответы с готовыми решениями:

Передать по воздуху от usb мыши к usb порту без провода
У меня есть мышь ss sensei wireless с убитой станцией приемника,аккумулятор мышь и выход usb у...

Как обратиться неопределяемому USB порту?
Есть старый сканер . Под него дрова только под ХРюшу. На 7 в режиме совместимости не идет. Просто...

Как передать и принять большое целое значение по сокетам?
Если допустим есть целочисленная переменная типа int со значением 1000 то как ее передать через...

Как передать даные через ajax и принять их на php
let person = { name:"Vova", last:"Nak", age:18 } // let person = "hello" // let...

21
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
23.03.2012, 16:58 2
приниматься будет бмп? выглядеть будет так: в начале пойдет заголовок, потом коды цветов пикселей построчно. файл прилагаю, писался под DOS с выводом графики через VBE поэтому лишнее выкинуть. проще думаю будет считанные из порта данные записать в поток, а потом заставить загрузить данные из этого потока объект Graphics::TBitmap. не пробывал но должно работать.
1
Вложения
Тип файла: rar BMP.rar (2.0 Кб, 43 просмотров)
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
23.03.2012, 16:59 3
и если уж это будет "как бы видео" придется поиграться с компонентами что бы не мигали: поставить DoubleBuffer как минимум
1
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
23.03.2012, 17:22  [ТС] 4
Мне будут присылаться только пиксели, данные по поводу цветов и размеров будут неизменны.
Спасибо, буду разбираться, с потоками программу делал, просто слабо представляю описание bmp файла.
И по поводу буфера согласен.
Не обязательно использовать именно bmp, может есть что-нибудь более удобное. Пиксели будут приходить из внешнего устройства, разрешение и количество цветов будет известно.
Или можно использовать другой формат, по другому рисовать как-нибудь?
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
23.03.2012, 18:44 5
устройство вы делаете? раз выбираете форматы значит наверное вы. при желании можно jpeg сделать или педальные mpeg, но все зависит от возможностей устройства.

Добавлено через 20 секунд
...а может даже вектор?
0
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
26.03.2012, 12:47  [ТС] 6
Ко мне будут приходить байты с пикселами, нужно выводить полученные изображения в реальном времени. То-есть получаться должно видео.
Разрешение известно. Вопрос только в том как из массива пикселов собирать изображения.

Добавлено через 49 минут
До меня доперло... Что если просто использовать TImage?
C++
1
Image1->Canvas->Pixels[i][j]
Интересно только какую частоту максимальную поставить можно будет. Обеспечит 24-25 кадров в секунду. Хотя для начала и 3 кадра/сек сойдет)
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
26.03.2012, 13:13 7
да, TImage использовать можно. причем что бы не было задержек по возможности лучше грузить в него сразу строчки через ->ScanLine[y]
1
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
26.03.2012, 16:20  [ТС] 8
Прости за вопрос, но не смог разобраться как через ScanLine считывать попиксельно и записывать пиксели.
y - это массив получается? Можешь дать простой пример в две строки.
0
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
26.03.2012, 16:40 9
Цитата Сообщение от Shalesbeer Посмотреть сообщение
Прости за вопрос, но не смог разобраться как через ScanLine считывать попиксельно и записывать пиксели.
y - это массив получается? Можешь дать простой пример в две строки.
В данном случае, Y - это строка из изображения, а вот результат от ScanLine[Y] - будет массивом, в котором уже можно получить цвет, указав соответствующий X. Но если мне память не изменяет, то нужно будет еще функцию кодировки в RGB прописать в зависимости от режима цвета, используемого в изображении.
1
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
26.03.2012, 16:59  [ТС] 10
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
В данном случае, Y - это строка из изображения, а вот результат от ScanLine[Y] - будет массивом, в котором уже можно получить цвет, указав соответствующий X. Но если мне память не изменяет, то нужно будет еще функцию кодировки в RGB прописать в зависимости от режима цвета, используемого в изображении.
Я понимаю что это строка, просто как это будет выглядеть? Как будет выглядеть один элемент из этого массива?
Использую черно-белые рисунки. RGB, то-есть как понял у меня R=G=B.
И как записать с помощью ScanLine, если конечно можно)
0
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
26.03.2012, 17:26 11
Цитата Сообщение от Shalesbeer Посмотреть сообщение
Я понимаю что это строка, просто как это будет выглядеть? Как будет выглядеть один элемент из этого массива?
Как значение цвета. Не знаю, как корректней на ваш вопрос ответить
C++
1
2
3
4
5
6
for (int Y = 0; Y < MyBitmap->Height; Y++)
{
  void * Row = MyBitmap->ScanLine[Y];
  for (int X = 0; X < MyBitmap->Width; X++)
    // ... = Row[X];
}
Цитата Сообщение от Shalesbeer Посмотреть сообщение
И как записать с помощью ScanLine, если конечно можно)
Да собственно никак, это свойство только для чтения информации, для записи используется Canvas. Но даже при этом производительность увеличивается в разы.
1
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
26.03.2012, 17:50  [ТС] 12
[QUOTE=DefineTrueFalse;2838434]Как значение цвета. Не знаю, как корректней на ваш вопрос ответить
C++
1
2
3
4
5
6
for (int Y = 0; Y < MyBitmap->Height; Y++)
{
  void * Row = MyBitmap->ScanLine[Y];
  for (int X = 0; X < MyBitmap->Width; X++)
    // ... = Row[X];
}
А в каком виде будет это Row[x]?
Мне надо будет отсылать информацию по битам, поэтому хочется чтобы было как уровень черно-белого.
Как перевести в простой integer этот void * ?
0
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
26.03.2012, 19:16 13
Цитата Сообщение от Shalesbeer Посмотреть сообщение
Как перевести в простой integer этот void * ?
А вот здесь int не советую использовать, так как с цветовыми значениями обычно работают с COLORREF (он же DWORD).
Цитата Сообщение от Shalesbeer Посмотреть сообщение
Мне надо будет отсылать информацию по битам, поэтому хочется чтобы было как уровень черно-белого.
Функцию для ч/б вам сейчас написать не могу (может гугл знает), но можно для работы с изображением перевести его в 32 bit. И далее воспользоваться функцией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
TColor To32bit(DWORD value)
{
    value&=0x00FFFFFF;
    DWORD ValueB=value;
    ValueB&=0x0000FF;
    ValueB*=0x10000;
    DWORD ValueR=value;
    ValueR&=0xFF0000;
    ValueR/=0x10000;
    DWORD ValueG=value;
    ValueG&=0x00FF00;
    return TColor(ValueR|ValueG|ValueB);
}
1
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
26.03.2012, 23:03 14
сканлайн изнутри (первые три пикселя) для формата 24 бит вроде должен быть такой
RGB RBG RGB... строки идут снизу вверх (нулевая - нижняя). вроде. при этом если размер всей строки оказывается не кратным 4 она дополняется до величины кратной 4 нулями. каждый цвет - байт. чисто черный 00 00 00. чисто белый FF FF FF. однако лучше было бы увидеть оригинальный формат который шлет устройство потому как может все наши измышления напрасны и там на самом деле нечто ужасное...
1
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
27.03.2012, 11:07  [ТС] 15
Цитата Сообщение от vxg Посмотреть сообщение
однако лучше было бы увидеть оригинальный формат который шлет устройство потому как может все наши измышления напрасны и там на самом деле нечто ужасное...
Будут приходить байты, использую микросхему CP2101 и её софт. Но с этим позже разбираться буду)
В каждом байте будет по два пикселя, то-есть два 4-х битных (16 цветов) пикселя. Двоичный код перевожу в десятичный (или шестнадцатеричный, поломаю может голову) и получается двухмерный массив integer с уровнями черного (рисунок черно-белый, R=G=B). Вот это чудо надо расставить по Image:
C++
1
Image1->Canvas->Pixels[i][j]=TColor(RGB(b,b,b));
Отправка производиться должна аналогично, нужно составить двухмерный массив (10-/16-ричный), перевожу все в двоичный код (пиксель = 4 бита) и отправляю.

Честно говоря привык работать с простым integer, типы Void и Byte часто ставят в тупик из-за сложности в мат. операциях.

Добавлено через 5 минут
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Функцию для ч/б вам сейчас написать не могу (может гугл знает)
Это я раскопал:
Яркость = 0,59*Зеленый+0,3*Красный+0,11*Синий
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
27.03.2012, 12:58 16
C++
1
Image1->Canvas->Pixels[i][j]=TColor(RGB(b,b,b));
безусловно будет работать, но можно поглядеть и на
C++
1
bmp->PixelFormat = pf4bit
уж очень предпочтительно может оказаться загрузка через ScanLine

вот ридер, грузит то грузит, но почему буквы зеленые не спрашивайте, пока не знаю
1
Вложения
Тип файла: rar bmp_reader.rar (265.7 Кб, 15 просмотров)
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
27.03.2012, 16:04 17
https://www.cyberforum.ru/digi... 14450.html

...вот только уточняющий вопрос: вы хотите просто передавать видеопоток (или кадрами) через нуль-модемный кабель (RS-232) или USB LINK кабель на основе CP2101/2 по схеме (виртуального COM порта):
PC - USB - CP2101 - UART ------- UART - CP2101 - USB - PC
?
0
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
27.03.2012, 16:52  [ТС] 18
Цитата Сообщение от raxp Посмотреть сообщение
...вот только уточняющий вопрос: вы хотите просто передавать видеопоток (или кадрами) через нуль-модемный кабель (RS-232) или USB LINK кабель на основе CP2101/2 по схеме (виртуального COM порта):
?
Использовать буду USB, попробую через софт для CP2102 (у них на сайте есть код в C Builder), в крайнем случае использую виртуальный COM. Информация будет потоком, ПЛИС посылает сигналы, а я уже буду выбирать от туда информацию и раскладывать. Для COM порта проблем не будет, аналогичную программу посылки и приёма байтов делал.

Вопрос пока стоит только в том, как в C-Builder из двоичного кода собирать изображения. Приходить видео будет все покадрово, только пиксели, разрешение и цвета известны заранее. И аналогично разбирать изображение по пикселям и переводить в двоичную систему.

Добавлено через 24 минуты
У меня черно-белое изображение, поэтому мне нужно знать только яркость.
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
27.03.2012, 16:53 19
...если у вас уже есть заполненный массив пикселей (принятый пакетом с COM порта) и известный BITMAPINFO, то тогда остается вопрос - у вас 8-битные изображения?
C++
1
2
3
4
5
BITMAPINFO *bm
BITMAPINFOHEADER bih;
unsigned char *buf;
 
HBITMAP hBmp = CreateDIBitmap(*pDC, &bih, CBM_INIT, buf, bm, DIB_RGB_COLORS);
1
5 / 5 / 3
Регистрация: 18.10.2011
Сообщений: 156
27.03.2012, 17:32  [ТС] 20
Цитата Сообщение от raxp Посмотреть сообщение
...остается вопрос - у вас 8-битные изображения?
Изображение черно-белое 4-х битное, т.е. два пикселя на байт (в будущем возможно изменяемое).
Пока не совсем понимаю принцип все работы. Можете скинуть источник, где всё это разобрано.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2012, 17:32

Как передать значение value и принять его на другой странице?
Есть вот такой большой input: &lt;input type=&quot;text&quot; title=&quot;Поиск&quot; id=&quot;text_field_1&quot;...

Как передать и принять файл в сети средствами WinSock ?
всем привет! никто не подскажет как передать и принять файл в сети средствами WinSock ???

Как правильно передать и принять файлы на (с) Ftp-сервера?
Как правильно передать и принять файлы на (с) Ftp-сервера?

Не получается по СОМ порту компьютера принять переданные с USARTA-stm32F429 данные
Обучаюсь программировать микроконтроллер на отладочной плате STM32F429-DISCOVERY. Обучаюсь...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.