onPreviewFrame не меняет данные - PullRequest
1 голос
/ 28 апреля 2011

Я впервые программирую на Android, и более того, я не настолько знаком с программированием на Java. Я пытался найти ответ на мою проблему через Интернет, но не нашел решения. Я надеюсь, что один из вас сможет мне помочь. Я хочу применить обработку изображения в реальном времени к видеокамере и отобразить ее. Вот почему я использую функцию onPreviewFrame для обработки изображений перед отображением результата. Пожалуйста, скажите мне, если это не лучший способ. моя проблема в том, что когда я пытаюсь изменить массив данных, ничего не меняется на экране. Из того, что я видел с отладчиком, функция называется. Все это делается с помощью API 2.1.

Кто-то знает почему? Как я могу решить это?

Чтобы помочь, вот мой код:

import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import java.io.IOException;

// ----------------------------------------------------------------------

public class CameraPreview extends Activity {    
    private Preview mPreview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Hide the window title.
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Create our Preview view and set it as the content of our activity.
        mPreview = new Preview(this);
        setContentView(mPreview);
    }

}

// ----------------------------------------------------------------------

class Preview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {
    SurfaceHolder mHolder;
    Camera mCamera;

    Preview(Context context) {
        super(context);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, acquire the camera and tell it where
        // to draw.

        mCamera = Camera.open();
        try {
            mCamera.setPreviewDisplay(holder);      
            mCamera.setPreviewCallback(this);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }


    public void onPreviewFrame(byte[] data, Camera camera) { 
        if (data != null) {
            for(int i=0;i<data.length;i++){
                data[i] = 0;
            }
        }

    }


    public void surfaceDestroyed(SurfaceHolder holder) {
        // Surface will be destroyed when we return, so stop the preview.
        // Because the CameraDevice object is not a shared resource, it's very
        // important to release it when the activity is paused.
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // Now that the size is known, set up the camera parameters and begin
        // the preview.
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(w, h);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }

}

Спасибо за помощь, Морган Кормье

Ответы [ 2 ]

2 голосов
/ 10 июля 2011

У меня работает только если я устанавливаю PreviewCallback в методе на SurfaceChanged

2 голосов
/ 25 мая 2011

Привет!Буфер (byte [] data), который передается в onPreviewFrame, является копией буфера кадров камеры, поэтому любые изменения в нем не будут отражены при предварительном просмотре камеры.

Я только что запустил AndroidРазработчик сам, но AFAIK лучший вариант - взять этот буфер и нарисовать его в другой SurfaceView, например, на поверхность openGL.Я взял образец, который должен продемонстрировать это:

http://nhenze.net/?p=154

Следуя этому примеру, вы можете взять данные изображения, выполнить некоторую обработку, а затем визуализировать ее.Если хотите, вы всегда можете попробовать пиксельные шейдеры в GL, чтобы выполнить обработку изображений (AFAIK - я сам не пытался сделать это на Android).

Надеюсь, это поможет!

...