任何人都可以在不单击camara click的情况下帮助我获取camerapreview帧数据。我想在不点击相机按钮的情况下获取正确的相机数据
问问题
1157 次
3 回答
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 回答
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 回答
1
这个来自 Xamarin 的秘籍解释了如何使用 Camera 类来获取预览并将其显示给用户。
于 2012-05-17T13:38:11.950 回答