2012-05-17 57 views

回答

2

我猜你正在尋找Camera類這個函數來獲取當期的相機數據,

public final void setPreviewCallback (Camera.PreviewCallback cb) 

定義回調

private PreviewCallback mPreviewCallback = new PreviewCallback() { 
     public void onPreviewFrame(byte[] data, Camera camera) { 
    } 
} 

預覽開始後,此回調將在每幀上觸發,數據(字節[])爲預覽格式,您可以在設置Camera Paramet ERS

首先得到的支持預覽格式

List<Integer> Camera.Parameters.getSupportedPreviewFormats() 

默認格式爲ImageFormat.NV21

如果你想改變預覽格式使用此功能,從可用格式中選擇一種格式列表

Camera.Parameters.setPreviewFormat(int pixel_format) 
1

This recipe來自Xamarin解釋瞭如何使用Camera類獲取預覽並將其顯示給用戶。

3

鑑於您使用的是MonoDevelop而不是使用Java編寫,因此該過程會有所不同。

您可以創建一個攝像頭預覽處理程序類,像這樣:

public class CameraListener : Java.Lang.Object, Camera.IPreviewCallback 
{ 
    public event PreviewFrameHandler PreviewFrame; 

    public void OnPreviewFrame(byte[] data, Camera camera) 
    { 
     if (PreviewFrame != null) 
     { 
      PreviewFrame(this, new PreviewFrameEventArgs(data, camera)); 
     } 
    } 
} 

public delegate void PreviewFrameHandler(object sender, PreviewFrameEventArgs e); 

public class PreviewFrameEventArgs : EventArgs 
{ 
    readonly byte[] _data; 
    readonly Camera _camera; 

    public byte[] Data { get { return _data; } } 

    public Camera Camera { get { return _camera; } } 

    public PreviewFrameEventArgs(byte[] data, Camera camera) 
    { 
     _data = data; 
     _camera = camera; 
    } 
} 

的類提供解僱每一幀接收事件。

在我自己的代碼,我用的是YUV420_NV21格式

我解碼使用下面的方法中的數據:

 unsafe public static void convertYUV420_NV21toRGB565(byte* yuvIn, Int16* rgbOut, int width, int height, bool monochrome) 
    { 
     int size = width * height; 
     int offset = size; 
     int u, v, y1, y2, y3, y4; 

     for (int i = 0, k = 0; i < size; i += 2, k += 2) 
     { 
      y1 = yuvIn[i]; 
      y2 = yuvIn[i + 1]; 
      y3 = yuvIn[width + i]; 
      y4 = yuvIn[width + i + 1]; 

      u = yuvIn[offset + k]; 
      v = yuvIn[offset + k + 1]; 
      u = u - 128; 
      v = v - 128; 

      if (monochrome) 
      { 
       convertYUVtoRGB565Monochrome(y1, u, v, rgbOut, i); 
       convertYUVtoRGB565Monochrome(y2, u, v, rgbOut, (i + 1)); 
       convertYUVtoRGB565Monochrome(y3, u, v, rgbOut, (width + i)); 
       convertYUVtoRGB565Monochrome(y4, u, v, rgbOut, (width + i + 1)); 
      } 
      else 
      { 
       convertYUVtoRGB565(y1, u, v, rgbOut, i); 
       convertYUVtoRGB565(y2, u, v, rgbOut, (i + 1)); 
       convertYUVtoRGB565(y3, u, v, rgbOut, (width + i)); 
       convertYUVtoRGB565(y4, u, v, rgbOut, (width + i + 1)); 
      } 

      if (i != 0 && (i + 2) % width == 0) 
       i += width; 
     } 
    } 

    unsafe private static void convertYUVtoRGB565Monochrome(int y, int u, int v, Int16* rgbOut, int index) 
    { 
     rgbOut[index] = (short)(((y & 0xf8) << 8) | 
         ((y & 0xfc) << 3) | 
         ((y >> 3) & 0x1f)); 
    } 

    unsafe private static void convertYUVtoRGB565(int y, int u, int v, Int16* rgbOut, int index) 
    { 
     int r = y + (int)1.402f * v; 
     int g = y - (int)(0.344f * u + 0.714f * v); 
     int b = y + (int)1.772f * u; 
     r = r > 255 ? 255 : r < 0 ? 0 : r; 
     g = g > 255 ? 255 : g < 0 ? 0 : g; 
     b = b > 255 ? 255 : b < 0 ? 0 : b; 
     rgbOut[index] = (short)(((b & 0xf8) << 8) | 
         ((g & 0xfc) << 3) | 
         ((r >> 3) & 0x1f)); 
    } 

我已經包括單色和彩色解碼器。

從該代碼所產生的數據是在565的OpenGL RGB格式,並且可以用於初始化OpenGL紋理或可以只是用於圖像分析等

鮑勃鮑威爾像素混亂。

+0

我忘了提及你必須啓用UNSAFE代碼。 –