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    229

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

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


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

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

 

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

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

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


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

Найдите миллионы труднодоступных

электронных компонентов

КЭС    1 143

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

 

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

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

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


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

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

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

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


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

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

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


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

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

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

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


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

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

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


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

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

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


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

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

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

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

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

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


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

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

похож

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

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


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

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

 

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

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

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

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


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

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

камера.bmp

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


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

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

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

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

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


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

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

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


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

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

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

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


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

Что-то вы путаете, глянул даташит на камеру 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    229

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

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


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

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

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
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 смайлов.

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

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

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

Загрузка...

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

    • Автор: Aven
      Находимся в поиске программиста на длительный проект.
      Что есть: плата на основе STM32F103 + SIM808 (используется GSM, GPS, Bluetooth) + GPIO
      Задача - заставить все это работать с сервером (сервер пишется).
      Подробности при личном общении.
      Желательно Ростов-на-Дону или Ростовская область.
      Связь через ЛС или почту Rough_ne(a)mail.ru.
       
    • Автор: User_1
      Всем привет!
      Почему-то этот код работает: 
      void Send_to_UART(char* string) { char data = 0; while(*string) { while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); data = *string; USART1->TDR = data; string++; } while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0D); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0A); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TC))); } char hello[13] = {'H','e','l','l','o',' ','W','o','r','l','d','!'}; int main (void) { Init_Clock(); Init_USART1(); Send_to_UART(hello); while(1); } А если написать вот так:
      int main (void) { Init_Clock(); Init_USART1(); Send_to_UART("Hello World!"); while(1); } то не просто не работает - микроконтролер зависает даже до входа в main().
      В Си ведь, насколько я понимаю, строка - это тот же массив символов
      Объясните, пожалуйста, что я делаю не так?
      Камень stm32f030, среда CooCox CoIDE
    • Автор: RDL_Rider
      Требуются разработчики электроники, знающие программирование STM32 или программисты STM32, знающие электронику, возможно студенты.
      Требования: желание развиваться в данном направлении, наличие собственных проектов на stm32.
      Возможно официальное оформление или договор подряда.
      Возможна удалённая работа, но всё равно актуально только для минчан, или для людей, 
      которые в случае чего в течение нескольких часов могут быть в Минске.
      Связь через ЛС.
    • Гость Andrey-Docent
      Автор: Гость Andrey-Docent
      Всем привет! Планируется сделать на базе arduino устройство, ведущее обмен данными с переферийным устройством по интерфейсу rs-232 и также необходимо контролировать работу arduino с помощью компьютера тоже посредством интерфейса rs-232. Но у arduino только один такой порт. Первая мысль в связи с этим - сделать ещё один порт и вывести линии RX и TX на другие (например цифровые) ножки порта. Можно ли как-то это сделать? Нет ли готовых библиотек для этого (на данный момент не нашёл таковых в интернете)? Может есть ещё какой-нибудь обходной путь? Заранее спасибо.
    • Гость Максим
      Автор: Гость Максим
      Всем светлым и умным головам привет!

      Никак не могу найти информацию о данном прерывании TIM1_BRK_UP_TRG_COM.
      Вопрос 1: Что это за стек или система прерываний? 
      Вопрос 2: Когда будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler, если также есть обработчик прерывания TIM1_CC_IRQHandler?
      Вопрос 3: период переполнения таймера равен 100 мкс. Сколько раз будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler до обработчика прерывания TIM1_CC_IRQHandler? По логике вещей, предполагаю, что 100 раз?
      Заранее благодарен!

      Всем радости))