swat24

Передача изображения с камеры OV9655 на ПК

26 сообщений в этой теме

swat24    9

Добрый день.

Необходимо передать изображение из камеры OV9655 на ПК и отобразить его, Камера имеет выходной формат изображения RGB 565, с камеры считываю с использованием DCMI:

uint32_t cameraData = DCMI_ReadData();

И после этого передаю через USART на ПК:

USART_SendData(Open_USART, (uint8_t) cameraData>>24);
while (USART_GetFlagStatus(Open_USART, USART_FLAG_TC) == RESET)
{}

USART_SendData(Open_USART, (uint8_t) cameraData>>16);
while (USART_GetFlagStatus(Open_USART, USART_FLAG_TC) == RESET)
{}

USART_SendData(Open_USART, (uint8_t) cameraData>>8);
while (USART_GetFlagStatus(Open_USART, USART_FLAG_TC) == RESET)
{}

USART_SendData(Open_USART, (uint8_t) cameraData);
while (USART_GetFlagStatus(Open_USART, USART_FLAG_TC) == RESET)
{}

На компьютере принимаю через терминал и сохраняю в HEX файл. Скажите как потом его можно открыть? В качестве просмотрщика планирую использовать Java, но теперь вопрос как преобразовать данные с камеры в изображение.

Может уже кто-то имел опыт работы с данной камерой? Подскажите, как можно передать изображение с нее на ПК?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

добавьте в начале файла шапку bmp формата и сохраните с расширением bmp и у вас получится готовая картинка которую сможете посмотреть чем угодно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

ок, сейчас попробую, а передаю правильно? Начиная со старшего байта необходимо?

 

добавил шапку, но открывать не хочет как картинку, пишет файл поврежден

Изменено пользователем swat24

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    1 109

Насколько я помню, в шапке должен быть указан размер файла и разрядность цветности. 

 

ПС. Попробуйте сначала "потренироваться на кошках", т.е. на заведомо известных данных простейших картинок. Я бы начал с одного пиксела :)

Изменено пользователем КЭС

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

Хорошо, а как-нибудь без шапки его можно открыть? каким-нибудь редактором? Я не особо уверен, что правильно передается с камеры изображение

Изменено пользователем swat24

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

не нахожу с 16 битным цветом изображения, попробовал создать в кореле и paint.net, но там или 24 бита, или 8 бит.

Ладно, попробую с камерой, которая уже JPEG выдает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

Я в фотошопе делал, только мне нужно было не для камеры, а для записи скриншота с дисплея на карту памяти. Какое у вас разрешение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

по идее если в шапке указан верный размер файла и прочие служебные данные, то файл с абсолютно любыми данными (верными или нет) откроется без проблем. Разница будет только в том будет ли видно изображение или белый шум. Если не открывается, значит чтото с заголовком. Надо читать даташиты на bmp и вкуривать что именно не так

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9
28 минут назад, andryxa сказал:

Какое у вас разрешение?

320x240, попробую еще с заголовком поиграться

http://www.fastgraph.com/help/bmp_header_format.html это правильный заголовок?

Изменено пользователем swat24

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407
6 минут назад, swat24 сказал:

это правильный заголовок?

похож

теперь надо открыть картинку нормальную и сопоставить данные

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

Создал изображение в paint.net - изменил размер, вставил свое изображение, но все-равно пишет "формат данного файла не поддерживается"

 

Оставил заголовок не изменяя вообще и получается следующее, похоже и передача не правильная

Безымянный.bmp

Изменено пользователем swat24

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

Держите правильную картинку (черная, вместо данных нули) 320х240 16 бит RGB. Свои данные можно подставить в любом хекс редакторе.

камера.bmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

Спасибо, в результате получается тоже, что и у меня с разноцветной мозайкой. Похоже не то считывается с камеры...

Смотрите, я считываю 32 бита данных с экрана, используются только 16 младших бит. И отправляю все, что принял. начиная со старшего байта. Правильно?

Изменено пользователем swat24

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

Использовать нужно старшие 5 бит красного, синего и 6 бит зеленого, для RGB 565. Это у вас один пиксель 32 бита?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9
9 минут назад, andryxa сказал:

Использовать нужно старшие 5 бит красного, синего и 6 бит зеленого, для RGB 565. Это у вас один пиксель 32 бита?

да, считывается с камеры по DCMI 32 бита

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

Что-то вы путаете, глянул даташит на камеру http://electricstuff.co.uk/OV9655-datasheet-annotated.pdf выходной формат данных 8 бит 565. То есть вы должны читать побайтно, на каждый пиксел идет два байта, в которых 5 бит красного цвета 6 бит зеленого и 5 бит синего цвета. В таком-же формате их и следует вставить в бмп картинку, после шапки. Откуда вы взяли 32 бита непонятно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

У меня функция возвращает 32 бита, т.е. получается два пикселя. Я их и запихиваю в бмп...

С камерами никогда не работал, поэтому и вопросов куча)

в файле получается такое:

cameraData.gif

Изменено пользователем swat24

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

В примере для камеры настраивается DMA на 32 бита источника и 16 бит приемник и отправляется на экран. Я считаю 2 байта на пиксель, так как выводится на экран, и буду отправлять попиксельно в юарт. Правильно? Вопрос как записывать в файл BMP? "00 00 ст мл" ? (ст - старший байт, мл - младший байт) или без пустых байт в начале?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

в файл нужно писать так-же как читаете но есть один нюанс, после шапки должен быть конец массива картинки, а в конце файла начало. короче массив данных полученных с камеры нужно каким-то образом развернуть и только после этого создать картинку

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

хорошо, получается в шапке я указываю начало картинки и с этого адреса шлю "ст"+"мл" байты и так всю картинку, правильно? Если даже не переворачивать массив - то картинка будет перевернута, но должна быть. Еще в файле после массива данных идет массив нулей, попробовал его убрать - ругается на то, что файл поврежден. Его оставляю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    228

нет, прочитанный массив нужно целиком перевернуть потому-что пиксель состоит из двух байт и у вас все перемешается. и только после переворота вставлять в картинку

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

я понял.

В общем нашел пример сохранения BMP в формате 565 на JAVA:

public static void main( final String[] args ) {
        BufferedImage img = map( 320, 240 );
        savePNG( img, "C:/test.bmp" );
    }

    private static BufferedImage map( int sizeX, int sizeY ){
        final BufferedImage res = new BufferedImage( sizeX, sizeY, BufferedImage.TYPE_USHORT_565_RGB );
        for (int x = 0; x < sizeX; x++){
            for (int y = 0; y < sizeY; y++){
                res.setRGB(x, y, Color.WHITE.getRGB() );
            }
        }
        return res;
    }

    private static void savePNG( final BufferedImage bi, final String path ){
        try {
            RenderedImage rendImage = bi;
            ImageIO.write(rendImage, "bmp", new File(path));
        } catch ( IOException e) {
            e.printStackTrace();
        }
    }

это работает, допишу завтра прием по юарт и попробую. Должно быть следующее:

шапка:

42 4d 42 58 02 00 00 00 00 00 42 00 00 00 28 00
00 00 40 01 00 00 f0 00 00 00 01 00 10 00 03 00
00 00 00 58 02 00 00 00 00 00 00 00 00 00 00 00
00 00 03 00 00 00 00 f8 00 00 e0 07 00 00 1f 00
00 00

далее принятый массив читаю с конца и пишу в файл, начиная с 42 байта с помощью:

res.setRGB(x, y, Color.WHITE.getRGB() );

только вместо "Color.WHITE.getRGB()" принятые данные.

 

Спасибо, что помогаете :) Завтра буду пробовать и отпишусь о результате

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: agbp
      Приветствую! 

      Мы - молодой стартап из Санкт-Петербурга с хорошей финансовой поддержкой. Создаём дроны.
      Нам не хватает серьезного программиста на полный загруженный график (можно удаленно). 

      Из основных задач, которые нужно будет решать: 
      1. Программа отслеживания объекта в видеопотоке (процессор STM32F4xx). 
      2. Программа стабилизации БПЛА по данным с гироскопа и наведение на цель. 
      3. Создание программы управления бесколлекторным двигателем по закрытому контуру с возможностью бесшовной интеграции с программой просчёта траектории ЧПУ станка. 
      4. Программирование бортового комплекса управления БПЛА (автопилот) 
      5. Полный пакет работ по созданию бортового и наземного комплексов управления роем БПЛА. 
      Оформление в штат. 
      ЗП обсуждаема, от 60 000 в месяц.
      P.S. дроны, беспилотники, авиамодели... это только начало!
    • Автор: Djanger
      Приобрёл "NUCLEO-F030R8, Отладочная плата на базе MCU STM32F030R8T6 (ARM Cortex-M0), ST-LINK/V2-1, Arduino-интерфейс"  хочу приобрести два модуля к ней но не знаю о совместимости , кого спрашиваю сомневаются и не отвечают уверенно, 1 модуль это 3,2 TFT ЖК дисплей сенсорный , а второй 8 бит LED 8 бит цифровой Tube 8-разрядный ключ. Кто что может подсказать или посоветовать прошу помочь 


    • Автор: alexmurphy
      Здравствуйте!

      Разовая работа для программистов из Москвы или московской области.

      Необходимо написать прошивку для отладочной платы на базе чипа BMI055
      Даташит: https://www.mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf

      Более подробное ТЗ вышлю кандидату.
      Железо предоставлю.
      Оплата по договоренности.

      При успешном выполнении, будут регулярные заказы, а также трудоустройство при желании, конкурентная зп по Москве.

      Если заинтересованы, просьба в комментах или в ЛС оставить контакты для связи.
    • Автор: Smith2007
      Исследую платку stm32f103c8t6.
      В качестве ide - Keil mVision v5.
      Проект на Си++
      При работе с UART мне требуется вывести некоторую информацию. Делаю это при помощи следующих функций:
      void USARTSend(char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(int val) { int i = 0; sprintf(buffer, "%x", val); while (buffer[i]) { USART_SendData(USART1, buffer[i]); i++; while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(const unsigned char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } } В некоторых строках вывожу текст следующим вызовом:
      USARTSend("\r\nUSART1 is ready.\r\n"); Компилируется без ошибок.
      Вывод сообщений в UART тоже без ошибок.
      Но в редакторе кода Keil  на против последней записи появляется значок warning!

      Код выполняется верно

       
      Как можно избавиться от неприятного предупреждения?
    • Автор: K.A.
      Добрый день. Пытаюсь собрать тахометр на stm32f100c8t6b. Вывод информации - четырехразрядный семисегментный индикатор, счетчик - таймер №1, 1ый канал. На системном таймере висит индикация показаний. Вычисление оборотов - в обработчике таймера 1. Проблема в том, что при подаче импульсов на PB13 (Tim1 Ch1) не происходит прерывания. Скажите, пожалуйста, что я упускаю из виду. Заранее большое спасибо.
       
       
      Taho_2.rar
  • Сообщения

    • не знаю что это такое...я тыкаю на ссылку и она открывается у меня и как понял у   motoandrey14 так же открылась и всё ок. Да и чего это аудиопорталу то открыватся так хитро как у вас?
    • А ничего, что по пути туда перекидывает через js.mamydirect.com/redir/clickGate.php ? Это безопасно?
    • Все хорошо, ток покоя регулируется))) оказалось все просто, прав был , нужно дальше крутить r20...Вот такой вопрос , до какой температуры греть усилитель, за 10минут без сигнала он нагрелся градусов до 35... при этой температуре устанавливать?
    • Я не горю желанием их продать. Я предлагаю. Мне они очень нравятся. Я бы купил, если бы у меня их не было.
    • Господа все в Париже ! (С)  Но всё равно - спасибо!)
    • Уважаемый @INI , вы оперируете абстрактными и сугубо индивидуальными понятиями такими как "слышать", "услышал"  но мы же на техническом форуме  поэтому просьба, объясните пожалуйста изменение каких физических величин приводит к улучшению или ухудшению качества воспроизводимой усилителем фонограммы например при замене межкаскадного конденсатора типа ФТ-1 0,22мкФ  250в на К73-17 0,22мкФ 250в или любые другие с той же  емкостью, или изменений ни на слух ни по показаниям приборов не будет? Вы надеюсь не будете отрицать, что звукотехника и акустика основана на физике и ее законах, тогда какими по вашему мнению средствами измерений эти изменения, после замены конденсаторов, можно увидеть или зафиксировать, например осциллограф, спектроанализатор, программными  типа спектролаб, комплекс Шмелева? По поводу " табуреток" на "помоечных" деталях, посмотрите пожалуйста фото несколькими постами выше, для меня простого электрика установленные в данных усилках деталюшки  ну ни разу не копеечные, все стоит денег. Знания и опыт которыми  Юрий Васильевич делится на этом, и не только, форуме в разы сокращает время (а оного как всегда не хватает)  для начинающих  ребят в их стараниях сделать ламповые звуковые устройства,  и устройства эти с отличными показателями и  хорошим звуком. И еще, не правильно в чужой карман заглядывать, нам всем какое дело продает человек свои усилки или на полках складывает, он своими рукам все делает и хлеб ест на честно заработанные. Вот например скриншот моего макета РР который на фото выше, номинальная мощность 20 ватт (на скрине), мах.38, делитель 1/20, глубина ОООС -8дБ, все параметры можно промерить, увидеть и зафиксировать. Сегодня включал в паре с однотактом, в нагрузке щиты ГИ с R=5.3 ом. Ссылка на записанный смартфоном звук, слушать лучше в наушниках. https://yadi.sk/d/gCrqQOix3YJhEq
    • Выключение модуля осуществляется ровно также, как и его включение. Только обратной операцией.
      Как его включить (или выключить) - подробно описано в документации на камень.