Camera2 api Imageformat.yuv_420_888 результаты для повернутого изображенияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Camera2 api Imageformat.yuv_420_888 результаты для повернутого изображения

Сообщение Anonymous »

Было задано много вопросов об api camera2 и формате изображений RAW, но, поискав в Интернете, я до сих пор не нашел ответа (кстати, именно поэтому я здесь).
Я пытаюсь выполнить обработку изображений в реальном времени на кадрах, снятых камерой, с помощью ImageReader и setRepeatingRequest с помощью фронтальной камеры. Как предлагалось в некоторых предыдущих сообщениях, я получаю изображение в формате RAW (в частности, Imageformat.yuv_420_888), чтобы иметь частоту кадров около 30 кадров в секунду:

Код: Выделить всё

  imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 2);
Мой алгоритм обработки изображений требует в качестве входных данных изображения RGB, поэтому мне нужно преобразовать из YUV в RGB. Для этого я использую ScriptIntrinsicYuvToRGB

Код: Выделить всё

  private static Bitmap YUV_420_888_toRGBIntrinsics(Image image) {

if (image == null) return null;

int W = image.getWidth();
int H = image.getHeight();

Image.Plane Y = image.getPlanes()[0];
Image.Plane U = image.getPlanes()[1];
Image.Plane V = image.getPlanes()[2];

int Yb = Y.getBuffer().remaining();
int Ub = U.getBuffer().remaining();
int Vb = V.getBuffer().remaining();

byte[] data = new byte[Yb + Ub + Vb];

Y.getBuffer().get(data, 0, Yb);
V.getBuffer().get(data, Yb, Vb);
U.getBuffer().get(data, Yb + Vb, Ub);

rs = RenderScript.create(context);
ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));

Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs)).setX(data.length);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);

Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(W).setY(H);
Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);

final Bitmap bmpout = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);

in.copyFromUnchecked(data);

yuvToRgbIntrinsic.setInput(in);
yuvToRgbIntrinsic.forEach(out);
out.copyTo(bmpout);
image.close();
return bmpout ;
}
Этот метод довольно быстрый, поскольку я могу преобразовать изображение 1080p менее чем за 20 мс. Единственная проблема заключается в том, что результат изображения поворачивается на 270 градусов (т. е. снимок сделан в ландшафтном режиме). Даже если я установлю JPEG_ORIENTATION в настройках сборки камеры,

Код: Выделить всё

captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION));
результат тот же.
Вот мой вопрос:
  • Есть ли способ получить вернуть повернутое изображение через встроенные функции renderscript?
  • Существует ли функция «поворота», которая не выделяет память?
  • Есть ли настройки для поворота изображения тип YUV?
    Другие решения, которые я пробовал - вращение матрицы, вращение массива YUV - довольно медленные. Более того, я думаю, что поворот изображения на 90/180/270 — простая задача, если сделать это после того, как оно было снято, просто нужно сохранить строки вместо столбцов (как-то).


Подробнее здесь: https://stackoverflow.com/questions/446 ... ated-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»