我需要做的很简单,我想使用相机回调手动显示来自相机的预览,我想在真实设备上获得至少15fps.我甚至不需要颜色,我只需要预览灰度图像.来自相机的图像是YUV格式,你必须以某种方式处理它,这是主要的性能问题.我正在使用API 8.
在所有情况下,我都使用camera.setPreviewCallbackWithBuffer(),它比camera.setPreviewCallback()更快.如果我没有显示预览,我似乎无法在这里获得大约24 fps.所以没有问题.
我试过这些解决方案:
1.在SurfaceView上将相机预览显示为位图.它有效,但性能约为6fps.
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
Run Code Online (Sandbox Code Playgroud)
2.在GLSurfaceView上将相机预览显示为纹理.这里我只显示亮度数据(灰度图像),这非常简单,每帧只需要一个arraycopy().我可以得到大约12fps,但我需要在预览中应用一些过滤器,看起来,它无法在OpenGL ES 1中快速完成.所以我不能使用这个解决方案.另一个问题中的一些细节.
3.使用NDK在(GL)SurfaceView上显示相机预览以处理YUV数据.我在这里找到了一个使用一些C函数和NDK 的解决方案.但我没有设法使用它,这里有更多细节.但无论如何,这个解决方案是为了返回ByteBuffer在OpenGL中将其显示为纹理,并且它不会比之前的尝试更快.所以我必须修改它以返回int []数组,可以使用canvas.drawBitmap()绘制,但我不理解C足以执行此操作.
那么,我有没有其他方法可以避免或尝试一些改进?
我想用android相机创建一个色度键效果.我不需要一步一步,但我想知道劫持Android相机并应用过滤器的最佳方法.我已经检查了API,并没有找到任何关于如何操纵来自相机的数据的超级权威.起初我研究过使用表面纹理,但我不完全清楚它是如何帮助或如何使用它.然后我使用GLSurfaceView检查,这可能是正确的方向,但不是很确定.
另外,要添加到我的问题,我将如何处理图像的预览和保存?我会以最少两次处理图像吗?一次预览和一次保存?我认为这可能是最好的解决方案.
最后,创建一个C/++包装器来处理优化速度的处理是否有意义?
任何帮助都将非常感激.一些例子的链接也将非常感激.
谢谢.
android opengl-es image-processing android-camera opengl-es-2.0
我有这段代码CameraPreview从a 获取a的位图TextureView并将其呈现在a上ImageView.
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
// Invoked every time there's a new Camera preview frame
bmp = mTextureView.getBitmap();
bmp2 = bmp.copy(bmp.getConfig(),true);
for(int x=0;x<bmp.getWidth();x++){
for(int y=0;y<bmp.getHeight();y++){
//Log.i("Pixel RGB (Int)", Integer.toString(bmp.getPixel(x,y)));
if(bmp.getPixel(x,y) < -8388608){
bmp2.setPixel(x,y,Color.WHITE);
}else{
bmp2.setPixel(x,y,Color.BLACK);
}
}
}
mImageView.setImageBitmap(bmp2);
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我将在相机显示的任何内容上应用实时图像处理.现在它只是背面和白色像素.它现在有点慢,位图的宽度和高度只有~250像素.
这是推荐的做法吗?
我在android中开发相机应用程序,我想在我的应用程序中启用实时过滤效果功能,我已经使用GPUimage过滤器为图像添加过滤效果.但我不知道如何启用实时过滤效果拍照前的相机预览.我已经使用相机和相机2 api下面的棒棒糖版本和棒棒糖版本.任何图书馆可用于此?我是初学者,任何人都可以帮忙吗?
我的目标是尽可能提高FPS.我会很满意BW小帧,但FPS应该是最大的.
getSupportedPreviewFpsRange在HTC WildFire S上返回(9,30).但是当我尝试用最简单的处理绘制预览图像时,它在视觉上最大可达到12-15 FPS.设置参数和startPreview()方法调用后,我这样做:
camera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
Bitmap bitmap = Bitmap.createBitmap(size.width, size.height, Bitmap.Config.ARGB_8888);
int[] colors = new int[size.width * size.height];
for (int i=0; i < colors.length; i++){
colors[i] = getBWColor(bytes[i]);
}
bitmap.setPixels(colors, 0, size.width, 0, 0, size.width, size.height);
secondView.setImageBitmap(bitmap);
}
});
}
private static int getBWColor(byte b){
int res = 255;
for(int i=0;i<3;i++){
res = (res << 8) + b;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法尽可能快地得到它?=(