2016-09-14 3 views
1

Вопрос

Я хочу сделать что-то подобное тому, что делается на Camera2Basic образце, то есть:Использование Camera2 для предварительного просмотра и камеры данные процесса

  1. Предварительный просмотр изображений с камеры с помощью TextureView
  2. Обработка изображения с камеры, используя ImageReader

С некоторыми отличиями относительно 2:

  • Я заинтересован только на сером канале (яркость) из изображений, подлежащих обработке. Их размеры должны составлять около 1000 x 1000 пикселей (и не самое высокое разрешение)
  • Когда доступно изображение для обработки, вместо сохранения изображений на диск будет вызываться общий метод process(Image). То, что этот метод делает это выходит за рамки этого вопроса, но она занимает около 50 мс, чтобы вернуть
  • Данные изображения должны быть обработаны периодически (около 10 кадров в секунду, но скорость не является критическим) вместо того, чтобы в конечном итоге

Как это сделать, используя API Camera2?

Наблюдения
  • Я изменил способ я создаю экземпляр ImageReader, выбирая меньшие размеры и другой формат (YUV_420_888 вместо JPEG). Для получения информации о яркости будет доступна плоскость Y. Есть ли более эффективный формат (поскольку я просто игнорирую самолеты U и V)?
  • Обе поверхности TextureView и ImageReader должны быть заполнены периодически, но с разной скоростью. Поскольку может быть только один повторяющийся CameraRequest на CameraCaptureSession (который может быть установлен по вызову setRepeatingRequest()), я должен периодически звонить по телефону capture() (например, позвонить setRepeatingRequest() с запросом на предварительный просмотр и вызывать capture() с запросом процесса)?
  • Можно ли улучшить производительность, отправив обработанные запросы для получения изображений, которые будут обработаны из изображений предварительного просмотра? Если да, то как я могу это сделать?

ответ

1

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

Также попробуйте проверить все значения, которые вы можете установить в CaptureBuilder, возможно, вы можете достичь своей цели с помощью SENSOR_TEST_PATTERN_MODE, COLOR_CORRECTION_MODE или BLACK_LEVEL_LOCK.Вы можете проверить всю информацию в android documentation

О процессе только один из каждых 10 кадров, просто отбрасывать кадры в вашем процессе() метод с использованием простой:

if (result.getFrameNumber() % 10 != 0) return; 

Наконец, не забудьте закрыть все изображения, которые вы получаете в вашем ImageReader OnImageAvailableListener, чтобы избежать утечек памяти и улучшить производительность: P

@Override 
    public void onImageAvailable(ImageReader imageReader) { 
     Image image = null; 
     try { 
      image = imageReader.acquireNextImage(); 
      //Do whatever you want with your Image 
      if (image != null) { 
       image.close(); 
      } 
     } catch (IllegalStateException iae) { 
      if (image != null) { 
       image.close(); 
      } 
     } 
    } 

надежду, что это поможет вам, дайте мне знать, если я могу помочь вам в чем-то еще!

 Смежные вопросы

  • Нет связанных вопросов^_^