2017-10-01 1 views
3

Android 앱을 OpenCV 라이브러리에 연결하려고하는데 카메라 옵션을보다 잘 제어하려면 기본 카메라를 사용해야합니다. 그것을 위해 내가 찾은 http://nezarobot.blogspot.it/2016/03/android-surfacetexture-camera2-opencv.html, 그것이 내가 필요로하는 것입니다. 내 문제는 내가 몇 가지 작은 변화와 함께,이 코드를 사용하는 경우 내가 그것을 시작할 때, 3 오류가있는 내 응용 프로그램 충돌이보고 있다는 것입니다 :Android 용 openCV 용 서페이스 : 이미 연결됨

  • E는/BufferQueueProducer : [SurfaceTexture는-0-31525-0] (연결 P) 이미 연결 (현재 = 4 REQ = 2)
  • D/PlateNumberDetection/DetectionBasedTracker 치명적인 신호 (11) (SIGSEGV), 코드 1 결함 ADDR 0x315e9858에서 : ANativeWindow_lock 오류 코드 -22
  • A/libc에 실패했습니다 tid 31735 (CameraBackgroun)

카메라를 닫으려고했습니다. oni jni 호출을 사용하면 첫 번째 프레임 만 캡처하고 표시 할 수 있지만 카메라를 다시 시작해야하므로 동일한 스레드를 자체적으로 만들 수는 없습니다.

여기 프레임을 가져 와서 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() 만 전달해야하므로 내 문제가 발생했습니다. 결과는 outputSurfaces에 있습니다. createCaptureSession –