android 相机预览上绘制,Android在相机预览上绘制

我正在创建一个虚拟现实应用程序,摄像机应该检测到面部,找到它们并在摄像机预览中显示它们的位置.

我知道有3种方法可以做到这一点,我想尽可能快地使用GLSurfaceView(according to this post),但是目前我正在尝试使用相机用于预览的相同SurfaceView.我在其上绘制的回调将是onFaceDetection,如下所示:

public class MyActivity extends Activity implements SurfaceHolder.Callback, Camera.FaceDetectionListener {

Camera camera;

SurfaceView svPreview;

SurfaceHolder previewHolder;

TextView tvInfo;

Paint red;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

svPreview = (SurfaceView) findViewById(R.id.svPreview);

tvInfo = (TextView) findViewById(R.id.tvInfo);

red = new Paint();

red.setStyle(Paint.Style.STROKE);

red.setStrokeWidth(3);

previewHolder = svPreview.getHolder();

previewHolder.addCallback(this);

previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

public void surfaceCreated(SurfaceHolder arg0) {

camera = Camera.open();

try {

camera.setDisplayOrientation(90);

camera.setFaceDetectionListener(this);

camera.setPreviewDisplay(previewHolder);

}

catch (IOException e) {

e.printStackTrace();

}

}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// . . .

camera.startPreview();

camera.autoFocus(null);

camera.startFaceDetection();

}

public void surfaceDestroyed(SurfaceHolder arg0) {

camera.stopFaceDetection();

camera.cancelAutoFocus();

camera.stopPreview();

camera.release();

camera = null;

}

public void onFaceDetection(Face[] faces, Camera camera) {

tvInfo.setText("Faces: " + String.valueOf(faces.length));

Canvas canvas = previewHolder.lockCanvas();

for(int i=0; i < faces.length; i++) {

Point leftEye = faces[i].leftEye;

Point rightEye = faces[i].rightEye;

// this is not working

canvas.drawPoint(leftEye.x, leftEye.y, red);

}

previewHolder.unlockCanvasAndPost(canvas);

}

}

使用此代码我不断收到此错误:

09-03 19:35:42.743: E/SurfaceHolder(19394): Exception locking surface

09-03 19:35:42.743: E/SurfaceHolder(19394): java.lang.IllegalArgumentException

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.view.Surface.lockCanvasNative(Native Method)

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.view.Surface.lockCanvas(Surface.java:76)

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:744)

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:720)

09-03 19:35:42.743: E/SurfaceHolder(19394): at com.bluetooth.activities.MyActivity.onFaceDetection(MyActivity.java:90)

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:729)

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.os.Handler.dispatchMessage(Handler.java:99)

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.os.Looper.loop(Looper.java:137)

09-03 19:35:42.743: E/SurfaceHolder(19394): at android.app.ActivityThread.main(ActivityThread.java:4424)

09-03 19:35:42.743: E/SurfaceHolder(19394): at java.lang.reflect.Method.invokeNative(Native Method)

09-03 19:35:42.743: E/SurfaceHolder(19394): at java.lang.reflect.Method.invoke(Method.java:511)

09-03 19:35:42.743: E/SurfaceHolder(19394): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)

09-03 19:35:42.743: E/SurfaceHolder(19394): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

09-03 19:35:42.743: E/SurfaceHolder(19394): at dalvik.system.NativeStart.main(Native Method)

09-03 19:35:42.743: W/dalvikvm(19394): threadid=1: thread exiting with uncaught exception (group=0x40a561f8)

09-03 19:35:42.766: E/AndroidRuntime(19394): FATAL EXCEPTION: main

09-03 19:35:42.766: E/AndroidRuntime(19394): java.lang.IllegalArgumentException

09-03 19:35:42.766: E/AndroidRuntime(19394): at android.view.Surface.unlockCanvasAndPost(Native Method)

09-03 19:35:42.766: E/AndroidRuntime(19394): at android.view.SurfaceView$4.unlockCanvasAndPost(SurfaceView.java:775)

09-03 19:35:42.766: E/AndroidRuntime(19394): at com.bluetooth.activities.MyActivity.onFaceDetection(MyActivity.java:99)

09-03 19:35:42.766: E/AndroidRuntime(19394): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:729)

09-03 19:35:42.766: E/AndroidRuntime(19394): at android.os.Handler.dispatchMessage(Handler.java:99)

09-03 19:35:42.766: E/AndroidRuntime(19394): at android.os.Looper.loop(Looper.java:137)

09-03 19:35:42.766: E/AndroidRuntime(19394): at android.app.ActivityThread.main(ActivityThread.java:4424)

09-03 19:35:42.766: E/AndroidRuntime(19394): at java.lang.reflect.Method.invokeNative(Native Method)

09-03 19:35:42.766: E/AndroidRuntime(19394): at java.lang.reflect.Method.invoke(Method.java:511)

09-03 19:35:42.766: E/AndroidRuntime(19394): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)

09-03 19:35:42.766: E/AndroidRuntime(19394): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

09-03 19:35:42.766: E/AndroidRuntime(19394): at dalvik.system.NativeStart.main(Native Method)

相机是否有问题试图在同一SurfaceView上绘制预览面部检测回调?如何在不分层SurfaceView的情况下执行此操作?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过在相机预览图上绘制矩形框来实现在 Android Studio 中的相机预览界面中画框的效果。以下是一个简单的实现示例: 1. 首先,确保你的项目中已经添加了相机权限和相机预览相关的依赖。 2. 在布局文件中添加一个 SurfaceView 用于显示相机预览图像: ```xml <SurfaceView android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在活动或者片段中获取 SurfaceView 的引用,并在相机预览回调方法中绘制矩形框: ```java public class CameraPreviewActivity extends AppCompatActivity implements SurfaceHolder.Callback { private Camera mCamera; private SurfaceView mPreview; private SurfaceHolder mHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera_preview); mPreview = findViewById(R.id.camera_preview); mHolder = mPreview.getHolder(); mHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 在此处获取相机预览图像的尺寸,并计算出矩形框的位置和大小 int left = width / 4; int top = height / 4; int right = width * 3 / 4; int bottom = height * 3 / 4; // 绘制矩形框 Canvas canvas = holder.lockCanvas(); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.RED); paint.setStrokeWidth(5); canvas.drawRect(left, top, right, bottom, paint); holder.unlockCanvasAndPost(canvas); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); } } ``` 在 `surfaceChanged()` 方法中,你可以根据实际需求计算出矩形框的位置和大小,并使用 `Canvas` 对象绘制矩形框。在这个示例中,矩形框的位置是相对于相机预览图像的宽高的四分之一和四分之三。 记得在 AndroidManifest.xml 文件中添加相机权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> ``` 这样,当你运行应用时,你会在相机预览界面中看到一个红色的矩形框。你可以根据需要自定义矩形框的样式和位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值