2017-10-01 9 views
3

J'essaie de connecter mon application Android avec la bibliothèque OpenCV et j'ai besoin d'utiliser une caméra native pour avoir plus de contrôle sur les options de la caméra. Pour le faire, j'ai trouvé http://nezarobot.blogspot.it/2016/03/android-surfacetexture-camera2-opencv.html, c'est ce dont j'ai besoin. Mon problème est que si j'utilise ce code, avec quelques petits changements et quand je le lance, mon accident d'application avec 3 erreurs signalées:surface pour openCV avec Android: déjà connecté

  • E/BufferQueueProducer: [SurfaceTexture-0-31525-0] connect (P): déjà connecté (cur = 4 req = 2)
  • D/PlateNumberDetection/DetectionBasedTracker: ANativeWindow_lock échoué avec le code d'erreur -22
  • A/libc: Signal Fatal 11 (SIGSEGV), le code 1, défaut addr 0x315e9858 en Tid 31735 (CameraBackgroun)

J'ai essayé de fermer l'appareil photo avant Je ne peux capturer et montrer que la première image, mais j'ai besoin de redémarrer la caméra et je ne peux pas créer le même thread par lui-même.

Ici, je prends le cadre et j'envoie au 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(); 
    } 
}; 

et ici je gère l'aperçu de la caméra

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(); 
    } 
} 

Répondre

1

Avez-vous essayé ce code sans votre « petite monnaie » d'abord? J'ai essayé ce projet et cela a bien fonctionné sur plusieurs appareils. Donc, il sera utile d'établir d'abord si cela ne fonctionne pas du tout sur votre téléphone, ou s'il y a un problème dans vos modifications.

+1

Merci pour votre réponse, je n'ai pas vérifié si le problème était dans mes modifications, mais j'ai trouvé mon problème, c'était sur outputSurfaces, car je dois passer seulement mImageReader.get(). GetSurface() dans createCaptureSession –