2

カマラクリックをクリックせずにカメラプレビューフレームデータを取得するのを手伝ってください。カメラボタンをクリックせずに正確なカメラデータを取得したい

4

3 に答える 3

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

モノクロデコーダーとカラーデコーダーの両方を含めました。

このコードから得られるデータは OpenGL 565 RGB 形式であり、OpenGL テクスチャを初期化するために使用したり、画像分析などのためにピクセルをいじったりすることができます。

ボブ・パウエル。

于 2013-01-12T17:55:52.647 に答える
3

Cameraクラスでこの関数を探していると思いますが、

   public final void setPreviewCallback (Camera.PreviewCallback cb)

コールバックを定義する

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

プレビューが開始されると、このコールバックが各フレームでトリガーされます。データ (byte[]) はプレビュー形式であり、カメラ パラメータの設定中に見つけることができます。

最初に、サポートされているプレビュー形式のリストを取得します

List<Integer> Camera.Parameters.getSupportedPreviewFormats()

デフォルトのフォーマットはImageFormat.NV21

プレビュー形式を変更する場合は、この機能を使用して、使用可能な形式から形式を選択します

Camera.Parameters.setPreviewFormat(int pixel_format)
于 2012-05-17T12:25:41.680 に答える
1

Xamarin のこのレシピでは、Camera クラスを使用してプレビューを取得し、それをユーザーに表示する方法について説明しています。

于 2012-05-17T13:38:11.950 に答える