2017-10-01 4 views
3

AndroidアプリをOpenCVライブラリに接続しようとしています。カメラオプションをより詳細に制御するためにネイティブカメラを使用する必要があります。それは私が見つけたhttp://nezarobot.blogspot.it/2016/03/android-surfacetexture-camera2-opencv.html、それは私が必要なものです。openCV for Android用のサーフェス:既に接続済み

  • E/BufferQueueProducerを:[SurfaceTexture-0-31525-0](接続 私の問題は、私はこのコードを使用する場合、いくつかの小さな変更とするとき、私はそれを起動すると、3つのエラーのある私のアプリのクラッシュが報告されたということですP):既に接続されている(CUR = 4 REQ = 2)
  • D/PlateNumberDetection/DetectionBasedTracker:致命的なシグナル11(SIGSEGV)、コード1、故障ADDR 0x315e9858で:ANativeWindow_lockエラーコード-22
  • A/libcので失敗しましたtid 31735(CameraBackgroun)

私はカメラを閉じようとしました私は最初のフレームだけをキャプチャして表示することができますが、カメラを再起動する必要があり、同じスレッドを単独で作成することはできません。

ここでフレームを取り、NDKに送信します。

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener 
     = new ImageReader.OnImageAvailableListener() { 

    @Override 
    public void onImageAvailable(ImageReader reader) { 

     Image image; 

     try { 
      image = reader.acquireLatestImage(); 
      if(image == null) { 
       return; 
      } 



      if (image.getFormat() != ImageFormat.YUV_420_888) { 
       throw new IllegalArgumentException("image must have format YUV_420_888."); 
      } 

      Image.Plane[] planes = image.getPlanes(); 

      if (planes[1].getPixelStride() != 1 && planes[1].getPixelStride() != 2) { 
       throw new IllegalArgumentException(
         "src chroma plane must have a pixel stride of 1 or 2: got " 
           + planes[1].getPixelStride()); 
      } 

      mNativeDetector.detect(image.getWidth(), image.getHeight(), planes[0].getBuffer(), surface); 


     } catch (IllegalStateException e) { 
      Log.e(TAG, "Too many images queued for saving, dropping image for request: ", e); 
      return; 
     } 
     image.close(); 
    } 
}; 

とここで私はカメラのプレビュー

protected void createCameraPreview() { 
    try { 
     SurfaceTexture texture = textureView.getSurfaceTexture(); 
     assert texture != null; 
     texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight()); 
     surface = new Surface(texture); 
     captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     captureRequestBuilder.addTarget(mImageReader.get().getSurface()); 

     BlockingSessionCallback sessionCallback = new BlockingSessionCallback(); 

     List<Surface> outputSurfaces = new ArrayList<>(); 
     outputSurfaces.add(mImageReader.get().getSurface()); 
     outputSurfaces.add(new Surface(textureView.getSurfaceTexture())); 

     cameraDevice.createCaptureSession(outputSurfaces, sessionCallback, mBackgroundHandler); 

     try { 
      Log.d(TAG, "waiting on session."); 
      cameraCaptureSessions = sessionCallback.waitAndGetSession(SESSION_WAIT_TIMEOUT_MS); 
      try { 
       captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); 


       Log.d(TAG, "setting repeating request"); 

       cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), 
         mCaptureCallback, mBackgrounHandler); 
      } catch (CameraAccessException e) { 
       e.printStackTrace(); 
      } 
     } catch (TimeoutRuntimeException e) { 
      Toast.makeText(AydaMainActivity.this, "Failed to configure capture session.", Toast.LENGTH_SHORT); 
     } 

    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

答えて

1

は、あなたが最初にあなたの「いくつかの小さな変更」することなく、そのコードを試してみました管理?私はそのプロジェクトを試して、複数のデバイスでうまくいきました。だから、あなたの携帯電話でまったく動作しないか、またはあなたの変更に問題がある場合は、最初に確立することは有益です。

+1

ありがとうございました。問題が修正されたかどうかは確認できませんでしたが、mImageReader.get()。getSurface()をcreateCaptureSessionに渡すだけで問題が見つかりました。 –

関連する問題