2011-04-28 4 views
1

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

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

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

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(); 
    } 

} 

Спасибо за помощь, Morgan Кормье

ответ

2

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

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

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

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

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

2

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

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