Я скопировал образец кода из 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)
код, представленный выше, находится в их sdk. Я проверил, что метод surfaceCreated запускается до lockConvas –
Я добавил isValid. и он проходит. проблема все еще остается –
Интересно, мы не можем заблокировать поверхность, установленную на этапе предварительного просмотра камеры –