Потерянные байты при отправке изображения из ESP32 в Android Studio через Bluetooth

Впервые спрашиваю здесь. В настоящее время у меня проблема с отправкой изображений, сделанных из ESP32 CAM, в мое приложение Android Studio.

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

Я заметил, что доступные байты варьируются от изображения к изображению, поэтому в отчаянной попытке я зациклил потоки вывода / ввода, чтобы делать снимки, пока доступные байты не превысят 14000. Все еще с большим количеством доступных байтов изображение много раз (хотя и не всегда ) отображает большой кусок серых пикселей.

Я читал, что это может быть связано с тем, что сокет Bluetooth должен быть закрыт в конечном исключении, но я не мог заставить это работать.

Буду очень признателен за вашу помощь!

private fun tomarFoto() { //Function to take the picture by sending an OutputStream and receiving the taken picture bytes through InputStream
  var bytes : ByteArray? = null
  val fotoEsp : ImageView = findViewById(R.id.fotoESP)
  var available = 0

  if (m_bluetoothSocket != null) {
    try {
      CoroutineScope(IO).launch {
        for (i in 0..4) {
          async {            
            m_bluetoothSocket!!.outputStream.write("a".toByteArray())
            delay(1500)
          }.await()

          available = m_bluetoothSocket!!.inputStream.available()
          println("Available1: ${available}")
          if (available > 14000) {
            break
          }
        }

        println("Available2: ${available}")
        bytes = ByteArray(available)
        m_bluetoothSocket!!.inputStream.read(bytes, 0, available)
        val bmp = BitmapFactory.decodeByteArray(bytes, 0, available)

        if (bmp != null) { //Flip image upside down
          fun Bitmap.flip(x: Float, y: Float, cx: Float, cy: Float): Bitmap {
            val matrix = Matrix().apply { postScale(x, y, cx, cy) }
          return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
        }

        val cx = bmp.width / 2f
        val cy = bmp.height / 2f
        val flippedBitmap = bmp.flip(1f, -1f, cx, cy)
        runOnUiThread {
          fotoEsp.setImageBitmap(flippedBitmap)
        }
      } else {
        runOnUiThread {
          fotoEsp.setImageBitmap(bmp)
        }
      }
    }
  } catch(e: IOException) {
      Log.e("client", "Cannot read data", e)
      e.printStackTrace()
    }
  }
}

Изображение серой области на полученном фото:

введите описание изображения здесь


person Alejandro Monsalve Krause    schedule 06.10.2020    source источник
comment
var nread = m_bluetoothSocket!!.inputStream.read(bytes, 0, available) Проверить nread. Не будет равно available, а будет меньше.   -  person blackapps    schedule 06.10.2020
comment
На самом деле я получил одинаковую ценность от обоих. Я также проверил количество байтов, взятых на Arduino Sketch с последовательного монитора, и получилось то же самое, что и получено, что означает, что проблема не в приложении Android, а в Sketch / ESP32CAM.   -  person Alejandro Monsalve Krause    schedule 04.12.2020


Ответы (2)


Для всех, кто столкнулся с этой проблемой, я наконец добрался до проблемы / решения.

Если вы используете пример CameraWebServer библиотеки ESP32 для конфигурации изображения, у вас также могут быть следующие параметры:

  if (psramFound()) {
   Serial.println("psramFound() true");
   config.frame_size = FRAMESIZE_UXGA;
   config.jpeg_quality = 10;
   config.fb_count = 2;
  } else { ........

Однако я обнаружил, что установка fb_count на 1 решила мою проблему.

Мне также пришлось изменить jpeg_quality на 20, вы можете поэкспериментировать с этим, чтобы найти сладкое место, чтобы оптимизировать качество вашего изображения, это число идет от 0 до 63, что означает 0 - лучшее качество.

person Alejandro Monsalve Krause    schedule 20.01.2021

Кажется, что фреймбуфер - не решение. Я использую:

Cconfig.frame_size = FRAMESIZE_SVGA;
Cconfig.jpeg_quality = 12;
Cconfig.fb_count = 1;

И фотографии становятся серыми снизу вверх примерно до 1/4 высоты.

Но это происходит только при очень ярком дневном свете (вид снаружи). Утром и вечером картины полные. Также в серый, темный полдень.

person Saku    schedule 18.06.2021
comment
Как вы думаете, яркость солнца влияет на передачу BLE? - person Michael Kotzjan; 18.06.2021