Чтение части растрового изображения на Arduino

Я довольно много начинаю, когда дело доходит до программирования и только недавно начал изучать C ++. Прямо сейчас я застреваю, пытаясь скрыть растровое изображение в двоичном массиве. Это для соревнований по робототехнике, которые я ввел. Растровое изображение представляет собой монохроматическое изображение шириной 54 * 96 пикселов 1 бит. Я путаюсь со смещенными позициями, пытаясь прочитать заголовок. Это код, который я написал до сих пор, и был бы очень признателен за любую помощь. Я думаю, что ошибка заключается в приращении переменной lineNo, которая должна быть в шестнадцатеричной форме, но как увеличить такие значения?

В конечном итоге я хочу прочитать только некоторые части растрового изображения, особенно коробки с крестом на них (см. рисунок ниже). Как узнать расположение пикселей?

 #include <SD.h>
#include <SPI.h>
File bMap;
File Text;
void setup()
{
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  int height = 0;
  int width = 0;
  int  bitmapOffset = 0xa;
  bMap = SD.open("map.bmp", FILE_READ);
  Text = SD.open("test.txt", FILE_WRITE);
  \\bMap.seek(0xa);
  \\bitmapOffset = bMap.read();
  \\Serial.println(bitmapOffset, BIN);
  \\Serial.println(bMap, HEX);
  bMap.seek(0x16);
  for (int i = 0; i < 4; i++) {
    height += (bMap.read() << (8 * i));
    Serial.println(height);
    int lineNo;
    int fileposition = 0;
    for (lineNo = 0; lineNo < height; lineNo++)
      fileposition = bitmapOffset + (lineNo);
    bMap.seek(fileposition);
    //Serial.print(lineNo);
    Serial.print(fileposition);
    //Serial.print(bitmapOffset);

  }

  bMap.seek(0x12);
  for (int i = 0; i < 4; i++) {
    width += (bMap.read() << (8 * i));
    Serial.println(width);
    if (Text) {
      Text.println(height, width);
      Text.close();
    }
  }
}

void loop() {}

 Maze

2 голоса | спросил Ozi 9 PM00000050000004831 2015, 17:11:48

1 ответ


2

Любая координата в растровом изображении (примечание: термин растровый рисунок здесь [все нижний регистр] относится к понятию сетки пикселей, а не к файлу Windows BMP, который я всегда буду называть BMP все в столицах) может легко рассчитываться до тех пор, пока вы знаете ширину. Высота нужна только для того, чтобы остановить вас слишком далеко.

Любое смещение пикселей в буфере пикселей вычисляется как y * width + x, предполагая left-right /top-down расположение пикселей в буфере.

Информация, которую вы действительно интересуете своим растровым изображением, на самом деле значительно меньше, чем в BMP, который вы показываете. Ваш BMP - 56x96 пикселей, но информация, которую вы действительно волнуете, на самом деле только в разрешении блоков размером 7x12.

Было бы намного проще, если бы вы могли предварительно обработать предоставленный BMP на ПК, чтобы создать массив из 84 записей, каждый с другим тегом или значением, чтобы представлять, что это такое. Тогда ваше изображение может быть представлено как массив:

{ 3, 3, 3, 3, 3, 3, 3,
  3, 1, 0, 0, 0, 1, 3,
  3, 0, 0, 0, 0, 1, 3,
  0, 0, 1, 1, 0, 0, 3,
  3, 2, 1, 0, 0, 0, 3,
  3, 1, 0, 0, 1, 0, 3,
  3, 0, 1, 0, 0, 0, 3,
  3, 0, 0, 0, 2, 0, 3,
  3, 0, 0, 1, 0, 0, 3,
  3, 1, 1, 0, 1, 0, 3,
  3, 0, 0, 0, 0, 0, 3,
  3, 3, 3, 0, 3, 3, 3 };

Где 0 - открытое пустое пространство, 1 - замкнутое черное пространство, 2 - черное пространство с крестом и 3 - пограничное пространство.

Затем два скреста будут вычисляться как (1,4) = 4 * 7 + 1 = 29 и (4,7) = 7 * 7 + 4 = 53

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

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

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

Если вы должны прочитать BMP-файл непосредственно на Arduino, тогда у меня есть код, который вы используете, чтобы помочь вам. Он не предназначен для Arduino, но для плат chipKIT (хотя он очень похож) и разработан как часть моей инфраструктуры DisplayCore для чипКита (и других более мощных) плат, но вы можете использовать любые нужные вам биты или просто использовать бит, чтобы дать вам больше информации о том, как работают файлы BMP. Вы можете получить код от Github здесь: https://github.com/MajenkoLibraries/DisplayCore /дерево /ведущий /ImageReaders /BMPFile

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

ответил Majenko 9 PM00000050000004031 2015, 17:40:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132