Заголовок BMP для прерывания потока изображений

#image #flutter #dart #bitmap #flutter-image

#изображение #флаттер #dart #растровое изображение #flutter-изображение

Вопрос:

Я смог получить потоковое видео, преобразовав данные uint8 в байты (код ниже), но это просто выглядит как статическое. Я думаю, что что-то не так с моим заголовком bitmap (я думаю, что он отсутствует). Не мог бы кто-нибудь сказать мне, пожалуйста, есть ли что-нибудь, что я могу включить из необработанных данных, которые я получаю для заголовка bitmap?

Информация о сообщении, которое я получаю:http://docs.ros.org/melodic/api/sensor_msgs/html/msg/Image.html

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

Пример полученных необработанных данных изображения:

{кодировка: bgr8, высота: 480, заголовок: {штамп: {секунды: 1599095871, nsecds: 933816910}, frame_id: bottom_camera_front, seq: 4766}, шаг: 1920, данные: gnZ8gnZ8gnZ8gnZ8gXZ5gXZ5f3V7f3V7fXZ7fXZ7fHR7fXV8fXV/fnaAfXV/e3Z/eXd9d3d9d3d9d3d9eXd9eXd9e3d9e3d9fXZ9fXZ9fnZ9fnZ9fnZ9fnZ9gHV9fnZ9fXl/enh enh enh eXd9eHZ8enh fXuBfHqAe3l/fXl/fHh fnd fnd gHh/gHh/hHmBhHmBgnqBgnqBgXqBgXqBfHqAfHqAenqAe3uBe3uBe3uBeXyBen2Cen2CfHyCfXuBf3uBf3uBf3uBf3uBf3uBf3uBf3uBgHyCgHyCgHyCgHyCgHyCgHyCgHyCgHyCgnuCgnuCgHyCgHyCfnyCfnyCe3qDe3qDd3qCd3qCdXqDdnuEdHuEdHuEcnuEcnuEdHyDdHyDdnyDdnyDeHuDeXuDeXuDe3qDfXqDfHmCfHmCfHmCfHmCfHmCfHmCfXqDeXqEenuFe3yGfH2HfH6GfX HfX HfX HfH EfH EfH EfH Ee36De36De36Ce36Cfn6Efn6Ef3 Ff3 FgIGFf4CEfYCEfH DfH De36Ce36CfH DfH Ee36Den2CfX2Df3 FgX FgX FgX FgX FgX Ff3 Ff3 Ff3 Ff3 Ff3 Ff3 FfYCFfYCFfYCFfYCFfIGEfIGEfIGEfIGEeoGEeoGEeoCFe4GGe4GGfYGGfYGGgICGgICGgoCGhICGhICGh3 Jhn6IhH IhH Ig36HhH IgoCGgoCGgX FgX Fg3 EhICFhYGGhYGGiIKHiYKHiYGIi4CIi4CIi4CIi4CIi4CIiYKHiYKHioOIioOIiIOFiIOFiIOFiIOFiYSGiYOIh4CHh3 Jh4CHhn Gh4CHh4CHiYGIioKJi4SJi4SJioOIio

 Widget _buildVideoOutput(snapshot) {
    if (!snapshot.hasData) {
      return Text("");
    }

    var msg = snapshot.data;
    // print(msg);

    var rawDataString = msg["data"]; //uint8 string (bgr8)
    // print(rawDataString);
    var secs = msg["header"]["stamp"]["secs"];
    // print(secs); //time in secs
    List<int> bytes = utf8.encode(rawDataString); //convert data to bytes
    // print(bytes);

    Uint8List dataInts = Uint8List.fromList(bytes);
    // print(dataInts);

    int imageWidth = 640;
    int imageHeight = 480;

    Bitmap bitmap = Bitmap.fromHeadless(imageWidth, imageHeight, dataInts);

    // Bitmap brightBitmap = bmp.brightness(bitmap, 0.2);
    // Bitmap nowThisBitmapLooksWeird = bmp.contrast(brightBitmap, 1.5);
    // Bitmap finalBitmap =
    //     bmp.adjustColor(nowThisBitmapLooksWeird, saturation: 1.0);

    Uint8List headedBitmap = bitmap.buildHeaded();

    //ui.Image outputImage = await bitmap.buildImage();
    //canvas.drawImage(outputImage, Offset.zero, ui.Paint());

    Image image = Image.memory(
      headedBitmap,
      fit: BoxFit.none,
    );

    return image;
  }
  

Комментарии:

1. Ваши данные, похоже, подразумевают, что ваше изображение имеет высоту 480 пикселей, но вы указываете BMP, что это 390×310…

2. Я не думал об этом. Я изменил высоту и ширину на 480 пикселей, и, похоже, я могу начать видеть некоторые формы, но в нем все еще много статики, и изображение повторяется по ширине.

3. Я не говорю «flutter / dart» , поэтому я здесь только предполагаю. Если изображение имеет формат bgr8, оно должно содержать 3 байта / пиксель. Если шаг равен 1920, это означает, что каждая строка начинается с 1920 байт после предыдущей, поэтому изображение должно иметь ширину 640 и высоту 480. Вы пробовали это в своем BMP? Это также означает, что ваши данные должны быть 640 * 480 * 3 длиной в байты. Это работает?

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

5. Я все еще не говорю «флаттер / дротик» , но, полагаю, у вас есть функция negate() или invert() ? Или установите для каждого пикселя значение pixel = 255 - pixel .