Android Camera2 получить массив байтов nv21 из изображения предварительного просмотра - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь получить значения черного и белого (плоскость Y) из рамки предварительного просмотра в camera2 API. Это то, что я до сих пор:

public void onImageAvailable(ImageReader, reader) {
   Image image = reader.acquireLatestImage();
   Image.Plane[] planes = image.getPlanes();
   ByteBuffer yPlane = planes[0].getBuffer();
   if (firstRun) {
      ySize = yPlane.remaining();
      nv21 = new byte[ySize];
   }
   yPlane.get(nv21, 0, ySize);
   Log.i(TAG, String.valueOf(nv21.length) + " " + String.valueOf(nv21[0]));
   image.close();
}

Однако длина массива не соответствует ожидаемой (1280 * 960 = 1 228 800, nv21.length возвращает 12 979 200), а nv21 [0] дает случайные значения. Что я делаю не так?

Заранее спасибо

1 Ответ

0 голосов
/ 21 марта 2019

Размер буфера не обязательно должен быть ровно 1280 * 960, поскольку между каждой строкой пикселей может быть шаг строки . Тем не менее, разница в 10 раз в общем размере кажется удивительной, но не невозможной - проверьте, что это за значение.

Я бы порекомендовал попытаться на самом деле нарисовать плоскость Y в ImageView (для отладки это не обязательно должно быть эффективным, поэтому вы можете просто использовать Bitmap, Canvas и drawColor), чтобы посмотреть, как это выглядит. Это просто полная фигня, или это настоящая плоскость Y со странным дополнением и т. Д.?

...