2015-10-09 3 views
0

Я скопировал образец кода из opencv4android (обнаружение лица). Я передал часть NDK. И запустите приложение на телефоне. Однако SurfaceView показывает только предварительный просмотр камеры. Кажется, что все, что сделано в OnCameraFrame, не влияет на Canvas на SurfaceView. Поэтому я отслеживаю их 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(getHolder().getSurface().isValid()){ 
//code goes here 
} 
+0

код, представленный выше, находится в их sdk. Я проверил, что метод surfaceCreated запускается до lockConvas –

+0

Я добавил isValid. и он проходит. проблема все еще остается –

+0

Интересно, мы не можем заблокировать поверхность, установленную на этапе предварительного просмотра камеры –

Смежные вопросы