我想在android手机中使用org.opencv.android.javacameraview作为背景。然后我希望使用opengl es在它上面绘制一些增强现实3d模型。任何人都知道如何实现这一点。操作系统是从GLSurfaceView驱动的。
答案 0 :(得分:1)
我使用的是Rajawali,它是OpenGL的叠加层。
我强烈建议你也使用它,因为它需要很多OpenGL的痛苦。无论如何,我在下面提到的确涉及一些Rajawali代码,但原则应该类似,你应该能够找出你需要的东西。如果你看看我的工作成果:
http://www.youtube.com/watch?v=yEioXZT-lv0
要做到这一点,我以编程方式而不是布局xml创建摄像机视图。我不得不玩一下,但以下对我有用 - 这是你的onCreate方法的活动:
mOpenCvCameraView = (CameraBridgeViewBase) new JavaCameraView(this, -1);
mOpenCvCameraView.setCvCameraViewListener(this);
mLayout.addView(mOpenCvCameraView);
mSurfaceView.setZOrderMediaOverlay(true);
setGLBackgroundTransparent(true);
mRenderer = new OpenGLRenderer(this);
mRenderer.setSurfaceView(mSurfaceView);
super.setRenderer(mRenderer);
mRenderer.setCameraPosition(0, 0, 20);
OpenGLRenderer扩展了RajawaliRenderer,后者又扩展了GLSurfaceView.Renderer。可能最好查看后两者的源代码而不是在这里重现。在我的OpenGLRenderer中,我在initScene()方法中设置了对象,相机等。我还添加了许多方法,可以从Activity调用来控制对象移动等。
我的活动使用下面列出的关键元素扩展了RajawaliActivity:
public class RajawaliActivity extends Activity {
protected GLSurfaceView mSurfaceView;
protected FrameLayout mLayout;
protected boolean mUsesCoverageAa;
private RajawaliRenderer mRajRenderer;
protected boolean checkOpenGLVersion = true;
protected boolean mDeferGLSurfaceViewCreation = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(!mDeferGLSurfaceViewCreation)
createSurfaceView();
}
protected void createSurfaceView()
{
mSurfaceView = new GLSurfaceView(this);
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
mSurfaceView.setEGLContextClientVersion(2);
mLayout = new FrameLayout(this);
mLayout.addView(mSurfaceView);
setContentView(mLayout);
}
我希望这有帮助 - 祝你好运!
答案 1 :(得分:0)
您可以在onCreate()
方法中执行此操作。请记住MyGLSurfaceView构造函数中的setFormat(PixelFormat.TRANSLUCENT)
:
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
mOpenCvCameraView = (CameraBridgeViewBase) new JavaCameraView(this, -1);
mOpenCvCameraView.setCvCameraViewListener(this);
addContentView(mOpenCvCameraView, new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));