2015-10-09 80 views
0

我从opencv4android(面部检测)复制了示例代码。我通过了NDK部分。并在手机上运行应用程序。但是SurfaceView只显示相机预览。看来OnCameraFrame中的任何操作都不会影响SurfaceView上的Canvas。所以我追踪到他们的SDK。问题在于deliverAndDrawFrame函数。有人有过同样的问题吗?lockCanvas一直抛出异常

Canvas canvas = getHolder().lockCanvas(); 
if (canvas != null) { 
canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR); 
Log.d(TAG, "mStretch value: " + mScale); 

if (mScale != 0) { 
    canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()), 
        new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth())/2), 
        (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight())/2), 
        (int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth())/2 + mScale*mCacheBitmap.getWidth()), 
        (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight())/2 + mScale*mCacheBitmap.getHeight())), null); 
} else { 
    canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()), 
        new Rect((canvas.getWidth() - mCacheBitmap.getWidth())/2, 
        (canvas.getHeight() - mCacheBitmap.getHeight())/2, 
        (canvas.getWidth() - mCacheBitmap.getWidth())/2 + mCacheBitmap.getWidth(), 
        (canvas.getHeight() - mCacheBitmap.getHeight())/2 + mCacheBitmap.getHeight()), null); 
} 

if (mFpsMeter != null) { 
    mFpsMeter.measure(); 
    mFpsMeter.draw(canvas, 20, 30); 
} 
getHolder().unlockCanvasAndPost(canvas); 
} 

错误:

10-09 21:57:47.485 28018-28088/com.example.tim.r3dmobileclient E/SurfaceHolder﹕ Exception locking surface 
java.lang.IllegalArgumentException 
     at android.view.Surface.nativeLockCanvas(Native Method) 
     at android.view.Surface.lockCanvas(Surface.java:253) 
     at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:848) 
     at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:816) 
     at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:412) 
     at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:348) 
     at java.lang.Thread.run(Thread.java:841) 

回答

1

您是否尝试过检查表面是否有效,试图锁定画布前? 如果所有这些代码是在一个循环试图锁定在画布前,把这个:

if(!getHolder().getSurface().isValid()){ 
continue; 
} 

如果不是在一个循环内,尽量把所有的代码(从锁定帆布及以下)这里面的if语句:

if(getHolder().getSurface().isValid()){ 
//code goes here 
} 
+0

我上面介绍的代码在他们的sdk中。我已经检查过在lockConvas –

+0

之前运行的surfaceCreated方法,我添加了isValid。并通过。问题仍然存在 –

+0

我想知道我们无法锁定相机预览阶段设置的表面 –