我想创建一个使用相机的Android应用程序,并在预览帧上应用图像处理过滤器。
package alex.filter;
import java.io.IOException;
import android.content.Context;
import android.graphics.Canvas;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
public Camera camera;
Preview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
for( int i = 0 ; i < data.length ; i ++ ){
data[ i] = 0; // or some sirius filter
}
Preview.this.invalidate();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(w, h);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
}
}
但是,无论我在onPreviewFrame
方法中做什么,我都看不到模拟器中的任何变化。
答案 0 :(得分:4)
另一个选择是使用OpenCV框架,它有一个Android端口:
http://opencv.willowgarage.com/wiki/Android2.3.0
它是开源计算机视觉项目的NDK端口,它将采用原始预览帧并允许使用OpenCV处理它们,然后在SurfaceView上显示它们。因为它操纵框架它不会像在硬件优化预览中直接挂钩那样以相同的帧速率运行,但是因为它本身就是很好的,所以它做得非常好。
上面链接的该版本中有一个OpenCV_Sample应用程序,它编译成一个演示应用程序,可以完成您正在寻找的大部分内容。它具有菜单选项,可以在预览区域启用反转,模糊图像或进行边缘检测。即使它不是您想要的,也可以在源代码中学习一些很好的示例。
答案 1 :(得分:2)
请参阅this link,我认为它与您想要实现的目标类似。
答案 2 :(得分:1)
那是因为您在回调中获得的预览缓冲区只是预览缓冲区的副本,因此您所做的任何修改都不会显示,因为您获得的缓冲区是您的副本。在android sdk here
中提到我不知道该如何做到这一点,但我一直在考虑如何解决这个问题,这就是我认为应该做的事情 -
<强>更新强>
重新访问SDK文档我发现了这个API - setPreviewTexture
这个API允许我们 - “将图像流中的帧捕获为OpenGL ES纹理”。使用应用的纹理获得图像后,可以使用OpenGL显示帧。 (看看@Stephan发布的关于如何做到这一点的答案。)
注意 - 从API级别11开始提供setPreviewTexture
! SDK Link