gpt4 book ai didi

Android Canvas 在相机上画线

转载 作者:行者123 更新时间:2023-11-29 20:08:21 25 4
gpt4 key购买 nike

我正在使用增强现实应用程序,我想画一条线来连接相机顶部的两个可移动对象。但是我得到了这个异常(exception)

Process: test.job.reality.augument.job.com.augumentrealitytest, PID: 15056
java.lang.IllegalArgumentException
at android.view.Surface.nativeLockCanvas(Native Method)
at android.view.Surface.lockCanvas(Surface.java:266)
at custom.MyCameraView$MyThread.run(MyCameraView.java:447)

这是我的代码,如您所见,我在 surfaceCreted 方法中启动我的线程。我在想我不能锁定 Canvas,因为它已准备好被相机锁定,对吗?但是我画线是否可能(我正在使用 beyondAR 增强现实库)

public class MyCameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback {
private MyThread thread;

public MyCameraView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}

@SuppressWarnings("deprecation")
private void init(Context context) {
mIsPreviewing = false;
mHolder = getHolder();
mHolder.addCallback(this);

configureCamera();

if (Build.VERSION.SDK_INT <= 10) {// Android 2.3.x or lower
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

thread=new MyThread(getHolder(),this);
getHolder().addCallback(this);
setFocusable(true);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);


}

public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.

thread.startrun(true);
thread.start();
try {

if (mCamera == null) {
init(getContext());
if (mCamera == null) {
return;
}
}

mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
if (mCamera != null) {
mCamera.release();
}
mCamera = null;
Logger.e(TAG, "CameraView -- ERROR en SurfaceCreated", exception);
}
}

public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();

thread.startrun(false);
thread.stop();
}

public class MyThread extends Thread{

private SurfaceHolder msurfaceHolder;
private MyCameraView mSurfaceView;
private boolean mrun =false;

public MyThread(SurfaceHolder holder, MyCameraView mSurfaceView) {

this.msurfaceHolder = holder;
this.mSurfaceView=mSurfaceView;
}

public void startrun(boolean run) {

mrun=run;
}

@SuppressLint("WrongCall")
@Override
public void run() {

super.run();
Canvas canvas;
while (mrun) {
canvas=null;
try {
canvas = msurfaceHolder.lockCanvas();
synchronized (msurfaceHolder) {
mSurfaceView.onDraw(canvas);
}
} finally {
if (canvas != null) {
msurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}

最佳答案

当表面用于显示相机预览时,您不能再在上面绘图。原则上,您可以在预览表面的顶部打开一个单独的透明 Canvas ,然后在该 Canvas 上绘图。切换到 OpenGL 预览(使用 SurfaceTexture)可能会容易得多;那么您可以为绘图使用相同的 OpenGL 上下文(但它们也必须用 OpenGL 表示)。您可以找到一个简单的演示项目 at GitHub开始。

但即使在这种情况下,您的任务也存在另一个问题:即使您的 CV 非常快,您的增强和直接从传感器到屏幕的相机帧之间也没有同步。在 OpenGL 的情况下,一些可以在 0 时间内完成的简单事情(例如,对接收到的纹理进行简单卷积)。但任何更有趣的东西都需要不同的东西。

我们通常对用户隐藏实时预览,在 onPreviewFrame() 回调中获取帧,处理它们并手动绘制帧和任何额外的线条或对象。这会引入一些延迟,但如果您的算法非常高效,则这种延迟可以忽略不计。

同样,OpenGL 通常在这方面有很大帮助。

关于Android Canvas 在相机上画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com