Sign in to follow this  
swat24

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

26 posts in this topic

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, но теперь вопрос как преобразовать данные с камеры в изображение.

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

Share this post


Link to post
Share on other sites
andryxa    232

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

Share this post


Link to post
Share on other sites
swat24    9

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

 

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

Edited by swat24

Share this post


Link to post
Share on other sites

DC/DC-преобразователи MORNSUN R3. Повышенная надёжность - сниженная стоимость!

Особенностью преобразователей R3 являются улучшенные технические характеристики, повышенная надёжность и сниженная стоимость. Электрическая прочность изоляции представленных преобразователей не менее 1500 В, а температурный диапазон применения -40…105ºС.

Подробнее...

КЭС    1337

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

 

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

Edited by КЭС

Share this post


Link to post
Share on other sites

Новые методы уменьшения дрейфа нуля в малошумящих АЦП Texas Instruments

Стабилизация с помощью двойного прерывания с двойным контролем в новых АЦП ADS1235 производства Texas Instruments позволяет снизить до минимума напряжение смещения и достичь высокой точности в измерительных цепях современных прецизионных цифровых приборов.

Подробнее...

swat24    9

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

Edited by swat24

Share this post


Link to post
Share on other sites
andryxa    232

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

Share this post


Link to post
Share on other sites
swat24    9

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

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

Share this post


Link to post
Share on other sites
andryxa    232

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

Share this post


Link to post
Share on other sites
mail_robot    1487

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

Share this post


Link to post
Share on other sites
mail_robot    1487
6 минут назад, swat24 сказал:

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

похож

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

Share this post


Link to post
Share on other sites
swat24    9

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

 

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

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

Edited by swat24

Share this post


Link to post
Share on other sites
andryxa    232

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

камера.bmp

Share this post


Link to post
Share on other sites
swat24    9

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

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

Edited by swat24

Share this post


Link to post
Share on other sites
andryxa    232

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

Share this post


Link to post
Share on other sites
swat24    9
9 минут назад, andryxa сказал:

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

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

Share this post


Link to post
Share on other sites
andryxa    232

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

 

Share this post


Link to post
Share on other sites
swat24    9

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

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

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

cameraData.gif

Edited by swat24

Share this post


Link to post
Share on other sites
swat24    9

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

Share this post


Link to post
Share on other sites
andryxa    232

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

Share this post


Link to post
Share on other sites
swat24    9

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

Share this post


Link to post
Share on other sites
andryxa    232

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

Share this post


Link to post
Share on other sites
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()" принятые данные.

 

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

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • Guest Proton
      By Guest Proton
      Здравствуйте.
      Имеется сигнальный трансформатор 1:1, которому нужно работать на пару сотнях кГц. Одна его обмотка идёт на линию, вторая служит для приёма и передачи сигнала, например с UART. Но как это реализовать? Выходной каскад, скорее всего, на биполярном транзисторе, входной - на ОУ, но имею малые представления о совмещении этого воедино.
      Прошу объяснить и направить на необходимую литературу.
      Спасибо.
    • By IgnatiusF
      Пытаюсь соединить AVR'ку со SCADA программкой SIMP Light. Она позволяет производить визуальный контроль и управление всем, чем вздумается при помощи микоконтроллера.
      Я делаю проект (стенд), на котором должно быть 4 тактовых расходомера, 3-4 датчика температуры и 2 реле для управления двумя электронагревателями во всем этом. Стенд отопления, в общем. И вот управление из компьютера всем этим мне показалось очень интересным, однако есть небольшие проблемы.
      Общение идет по протоколу MODBUS RTU, то есть в команде для, например, считывания состояния пина находятся:
      [Адрес МК] [Номер команды] [Адрес 1-го пина] [Количество пинов] [Контрольная Сумма].
      Содеиняю через USB-to-TTL преобразователь, Скада шлет мне команду [64 02 00 00 00 01 B0 3F], я пытаюсь ответить [64 02 01 00 BF 44]. Но в место этого байты почти всегда идут раздельно, то по 1, то по 2 байта. Однако даже когда посылка доходит вся целиком, то Скаду это все равно не устраивает. False пишет. Ответы составлял по видео от Александра Писанца линк.
      Вопросы такие:
      1. Почему данные идут раздельно, хотя я заношу следующий байт отправки сразу по очищению регистра UDR? Я, конечно, сделал все довольно странно, но как мне кажется отправка должна быть непрерывной.
      2. Если кто-нибудь знает/понимает что в ответе для Скады не так тоже прошу помочь, хоть это и не по теме раздела.
      3. Можете ли вы помочь мне сделать все не как у меня, а по-человечкски? Если найдете какую-то непотребщину, неправильную логику и прочие ошибки в исходнике, прошу, подскажите как исправить.
      Исходный файл с нормальным оформлением и с необходимыми комментариями. Писал на жесткой логике, просто чтобы заработало. [main.c]
      Изначально пытался "оживить" проект Александра из видео на ATMEGA328P (перенес с ATMEGA16), Скада обращалась по адресу, однако реакции от МК никакой. [MADBAS.zip]
      UPD: Просмотрел код, возможно это из-за того, что неправильно выставлено значение таймера (OCR0A = 70). Когда я запустил только проект, то реакции не было никакой вообще на светодиоде, хотя по логике обращение было к нему, значит надо мигнуть.
      Потом я сделал автоматический расчет значений для UBRR0H и UBRR0L (UBRRL_value ((F_CPU/(BAUD*16))-1)), светодиод начал отвечать. Изначально были выставлны значения вручную (0 и 103). В этом ли дело?
    • By oner
      Нужен программист под STM32 из Питера. Задачи: Программирование под STM32 при работе в сетях сотовой и спутниковой связи с серверами.
      Работа проектная, не исключено, что с трудоустройством. Оплата - договорная.
    • By В гостях у Slime
      Здравствуйте, мне нужна помощь с подключением дисплея WG12864 к STM32F103C8T6. А именно? Я не нашёл библиотек для него, лишь только ардуиновские. Может у кого есть своя? С STM32 опыта почти нет. Так мигал светодиодом и всё, но зато ардуину я уже знаю всё. Я перерос её и мне хочется освоить стм.
    • By IgnatiusF
      Все так же думаю о создании подобия отладочной платы для avr'ок, и надумал, чтобы на ней и МК бы прошивался по ISP, а после и общение наладить между компьютером и МК по UART'у. По отдельности проблем никаких нет, а вот совместить одно с другим - не уверен. Я не знаю, будет ли присутствие USBtoUART'а негативно влиять на программирование МК, или будет ли программатор влиять на МК во время передачи данных по UART.
      При этом, конечно, необходимо подключить все напрямую на постоянной основе и желательно (очень) по 1 USB порту. Могли бы вы подсказать как это возможно сделать, и возможно ли вообще?