Разбивка изображения
Я пытался найти способ сохранить изображение на Arduino, но не смог. Я пытался сделать с этим изображением следующее:
- Проверьте, есть ли изображение на Arduino, отобразив его на сенсорном экране (у меня 2,8-дюймовый сенсорный экран Adafruit)
- Разбить изображение на массив, в котором содержится попиксельная информация о цвете RGB изображения.
int pictureData = [[100,50,0],[176,255,5],...]; // Значения RGB в массиве
Как сохранить изображение и разбить его, как показано? Нет ли способа сделать это? Буду признателен за любую помощь! Большое спасибо!
Я использую Arduino IDE для кода, и у меня есть Arduino Uno/MEGA, которые всегда необходимы для этой задачи. Вся информация об экране находится на сайте adafruit: https://www.adafruit.com/product/376
На изображении ниже показан пример отображения изображения:
2 ответа
Лучший ответ:
Я предполагаю, что вы пытаетесь создать систему, в которой хранится одно изображение, и хотите, чтобы это изображение было доступно без использования устройства чтения SD-карт в системе.
Если логика вашей программы достаточно мала, чтобы уместиться примерно в 18 КБ флэш-памяти, вы можете сохранить одно изображение размером 230 КБ во флэш-памяти на Mega. (230 КБ + 18 КБ + 8 КБ = 256 КБ = мегаразмер флэш-памяти. 8 КБ — это мегаразмер загрузчика.) См. PROGMEM на странице arduino.cc с примерами объявления и доступа к массивам из флэш-памяти.
Если вам в конечном итоге потребуется намного больше флэш-памяти для логики вашей программы, рассмотрите возможность сжатия 18 битов каждого пикселя до 16 бит. Цифра 230 КБ равна 240·320·3. Каждый пиксель на дисплее использует шесть битов на цвет, хранящихся в трех байтах на пиксель. Вместо того, чтобы сохранять все биты, вы можете обрезать синий цвет до его старших четырех битов; т.е. сохранить 6-6-4 для RGB в двух байтах вместо 6-6-6 в трех байтах. Или можно обрезать два цвета до их старших пяти битов; например, сохранить 6-5-5 или 5-6-5. При двух байтах на пиксель изображение заняло бы 240·320·2 = 153 600 байт флэш-памяти, оставив примерно 94 КБ для программной логики.
Во всех этих подходах данные изображения передаются в ОЗУ строка за строкой или столбец за столбцом, распаковываются и копируются в буферы ОЗУ на дисплее.
Можно также применить к изображению некоторые алгоритмы сжатия вместо использования формата BMP.
Если вам нужно больше изображений, чем одно, вы можете еще больше снизить качество изображения, например, можете сохранить 3-3-2 старших бита цвета на пиксель или можете сохранить только каждый второй пиксель в строке или столбце или в обоих, уменьшая хранения до половины или четверти как много. Или у вас может быть одно достаточно хорошее изображение, хранящееся в формате 6-6-4 с 16 битами на пиксель, то есть около 154 КБ, плюс несколько монохромных изображений, хранящих один бит на пиксель, или около 10 КБ каждое.
Редактировать 1: Что касается вопроса «Как мне взять изображение и преобразовать его в массив RGB?», один из простых способов — написать программу преобразования изображений (которая работает в вашей системе разработки). читать файл изображения и выводить код C, представляющий данные изображения в массивах; то есть для создания массивов в стиле C, напечатанных в ASCII. Опять же, эта рекомендация основывается на предположении, что вы пытаетесь создать систему, в которой хранится одно изображение, и хотите, чтобы это изображение было доступно без необходимости в устройстве чтения SD-карт в системе.
Я рекомендую написать программу преобразования изображений на Python. См., например, принятый ответ на Преобразование изображения в 2D-массив в python, к которому вы потребуется добавить несколько строк кода, чтобы записать код C в файл, чтобы вы могли включить этот код в скетч. См. также Как получить массив из значений RGB растрового изображения? и Работа с файлами .bmp в python 3.
Некоторые примеры на языке C появляются в ответах на вопрос Как преобразовать изображение .bmp в массив байтов с помощью программы C и Как преобразовать изображение в массив WORD (uint16)?, которые входят в число первые ссылки в поиске stackexchange по запросу "конвертировать bmp-изображение в массив".. р>
В статье Википедии формат файла BMP показан общий макет файлов BMP. Использование различных библиотек обработки изображений (как рекомендовано в вопросах SE, перечисленных выше) позволяет избежать необходимости иметь дело с низкоуровневыми деталями BMP. Однако вы можете использовать простую программу или приложение для создания файлы цветового формата RGB565, например, как в Bitmap в формат RGB565 на codeguru.com, а затем напишите простую программу для преобразования этой конкретной формы в массивы в стиле C, напечатанные в ASCII.
Спасибо, это было очень полезно. Но как мне взять изображение и преобразовать его в массив RGB?, @Assafi Cohen-Arazi
@AssafiCohen-Arazi, см. редактирование 1., @James Waldby - jwpat7
Обратите внимание: если у вас есть программа преобразования изображений, вы можете преобразовать изображение в двоичный формат [PPM](https://en.wikipedia.org/wiki/Netpbm_format), формат, который тривиален для анализа, или даже в [XPM]. (https://en.wikipedia.org/wiki/X_PixMap), что на самом деле является допустимым кодом C., @Edgar Bonet
240 на 320 пикселей. Это 76800 пикселей. В вашем примере похоже, что вам нужно 3 байта на пиксель, так что это 230400 байт. Arduino Mega имеет 8 КБ памяти SRAM. В памяти Arduino Mega достаточно места для хранения 0,003% вашего изображения.
Возможно, вы могли бы сохранить изображение на SD-карте и понемногу выводить его на экран, но это будет очень медленно.
Есть ли еще способ сохранить данные изображения в массиве?, @Assafi Cohen-Arazi
И еще: как можно передать данные изображения в виде показанного массива RGB?, @Assafi Cohen-Arazi
Есть ли еще способ сохранить данные? Вы действительно не понимаете, что 230 КБ никогда не поместятся в пространство 8 КБ? Подумайте об этом так: есть ли способ налить 230 галлонов воды в ведро емкостью 8 галлонов?, @Delta_G
Вам не нужно загружать весь образ (230 КБ) из флэш-памяти (256 КБ) в SRAM (8 КБ). А 8 КБ из 230,4 КБ — это 3,6%, а не 0,003%., @gre_gor
@Delta_G О имел в виду карту micro SD, чтобы места было достаточно, извините, что не объяснил., @Assafi Cohen-Arazi
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отобразить символ º на ЖК-дисплее?
- Возможно ли иметь массив массивов int?
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Инициализация массива структур
- Путаница между SPI и I2C для SSD1306 OLED
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
- Невозможно создать массив типа const char*
Пожалуйста, отредактируйте свой вопрос, включив в него номер детали и ссылку на «сенсорный экран adafruit 2,8 дюйма», общие характеристики, а также формат изображения (jpg, bmp и т. д.) и его сохраненный размер. Это уменьшит количество времени, которое люди тратят на угадывание количества пикселей на дисплее и количества байтов в изображении., @James Waldby - jwpat7
@JamesWaldby-jwpat7 Спасибо, что уделили время. Я добавил это в вопрос., @Assafi Cohen-Arazi