Как нарисовать обработанный кадр обратно на экран в Camera2 API - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь получить кадры видео из Camera2 API в Android Studio и выполнить простую обработку изображения для каждого кадра.

У меня проблема с отрисовкой обработанного кадра обратно на экран.

Я использую код из примера camera2raw .

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

Прямо сейчас я просто добавляю постоянное значение к каждому пикселю, чтобы увидеть, изменилось изображение на экране или нет.

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

Поэтому я вполне уверен, что не записываю измененные значения пикселей обратно на экран.

Вот фрагмент кода из соответствующих частей программы:

ImageReader.OnImageAvailableListener imageAvailableListener = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image image = null;
        try {
            image = reader.acquireLatestImage();

            ByteBuffer Y = image.getPlanes()[0].getBuffer();
            ByteBuffer U = image.getPlanes()[1].getBuffer();
            ByteBuffer V = image.getPlanes()[2].getBuffer();

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

            byte[] data = new byte[Yb + Ub + Vb ];
            //your data length should be this byte array length.

            for (int i = 0; i < 512; i++)
            {
                for (int j = 0; j < 512; j++)
                {
                    int idx = i * 512 + j;
                    data[idx] += 255;
                }
            }
            // Screen should now show some distortion.
            Y.get(data, 0, Yb);
            U.get(data, Yb, Ub);
            V.get(data, Yb+ Ub, Vb);

        } catch (Exception ee) {
        } finally {
            if (image != null)
                image.close();
        }
    }

    //void save(byte[] bytes) {
        File file12 = getOutputMediaFile();
        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(file12);
            outputStream.write(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null)
                    outputStream.close();
            } catch (Exception e) {
            }
        }
   // }
};

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

Может кто-нибудь подсказать, пожалуйста, как я записываю обратно на экран модифицированный кадр?

Я также пытался сделать это:

// Convert bytes data into a Bitmap
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
ImageView imageView = new ImageView(MainActivity.this);
// Set the Bitmap data to the ImageView
imageView.setImageBitmap(bmp);
// Get the Root View of the layout
ViewGroup layout = (ViewGroup) findViewById(android.R.id.content);
// Add the ImageView to the Layout
layout.addView(imageView);

Есть сообщения, связанные с этой проблемой, но ни одно не имеет точного решения. Может кто-нибудь дать мне ссылку на подробные пошаговые инструкции о том, как добиться того, что я описал?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...