2016-12-01 3 views
0

Я пытаюсь выполнить ImageProcessing в текущем кадре Preview на Android. В случае использования любого другого смартфона он работает очень хорошо. Но теперь я должен сделать приложение доступным для Nexus 5x.Nexus 5x Рамки из предварительного просмотра повернуты Camera2

Там я получаю изображение на 180 градусов из предварительного просмотра. Как я могу это исправить? Вот мой код для настройки моей камеры и Preview:

private void resetCamera(int width, int height){ 
    Log.d(TAG, "Reset Camera!"); 
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try { 
     for (String cameraId : cameraManager.getCameraIdList()) { 
      CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); 
      mSensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
      if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) { 
       continue; 
      } 
      StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 

      mImageReader = ImageReader.newInstance(width, 
        height, 
        ImageFormat.YUV_420_888, 
        10); 
      mImageReader.setOnImageAvailableListener(mOnImageAvailableTrack, 
        mBackgroundHandler); 

      mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height); 
      mCameraId = cameraId; 
      return; 
     } 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

Preview:

private void createTrackingPreviewSession(){ 
    try{ 
     SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); 
     surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
     Surface previewSurface = new Surface(surfaceTexture); 
     mPreviewCaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     mPreviewCaptureBuilder.addTarget(previewSurface); 
     mPreviewCaptureBuilder.addTarget(mImageReader.getSurface()); 

     int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
     mPreviewCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 
       getOrientation(rotation)); 

     mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, mImageReader.getSurface()), 
       new CameraCaptureSession.StateCallback(){ 
        @Override 
        public void onConfigured(CameraCaptureSession session) { 
         if(mCameraDevice == null){ 
          return; 
         } 
         try{ 
         Toast.makeText(getApplicationContext(), "Create Tracking Session", Toast.LENGTH_SHORT).show(); 
          mPreviewCapture = mPreviewCaptureBuilder.build(); 
          mCaptureSession = session; 
          mCaptureSession.setRepeatingRequest(
            mPreviewCapture, 
            mSessionCaptureCallback, 
            mBackgroundHandler 
          ); 
         } catch(CameraAccessException e){ 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onConfigureFailed(CameraCaptureSession session) { 
         Toast.makeText(
           getApplicationContext(), 
           "create Camera session failed!", 
           Toast.LENGTH_SHORT 
         ).show(); 
        } 
       }, null); 
    } catch(CameraAccessException e){ 
     e.printStackTrace(); 
    } 
} 

Как вы можете видеть, я пытался использовать исправление для захвата изображения, но он не сделал help Я все еще получаю изображение с изображениями из Preview.

Если возможно, я хотел бы получить решение, которое пытается изменить настройки камеры. Я не хочу превращать изображение самостоятельно, когда получаю его через связанный ImageReader.

ответ

0

Если вы правильно поняли свой вопрос, я постараюсь сделать следующее, если вы еще этого не сделали. Я думаю, что ваша проблема не находится в вашем previewCaptureSession, а скорее в коде, чтобы сделать снимок.

Возможно, вы используете другой CaptureRequest.Builder с шаблоном CameraDevice.TEMPLATE_STILL_CAPTURE.

Для этого Builder вы должны установить ориентацию JPEG. Как я уже сказал в комментариях, некоторые камеры имеют 90 °, а другие - 270 °.

Чтобы установить правильную ориентацию, выполните следующие два фрагмента.

private static SparseIntArray ORIENTATIONS = new SparseIntArray(); 
static{ 
    ORIENTATIONS.append(Surface.ROTATION_0, 0); 
    ORIENTATIONS.append(Surface.ROTATION_90, 90); 
    ORIENTATIONS.append(Surface.ROTATION_180, 180); 
    ORIENTATIONS.append(Surface.ROTATION_270, 270); 
} 

private int sensorToDeviceRotation(CameraCharacteristics cameraCharacteristics, int deviceOrientation){ 
    int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
    deviceOrientation = ORIENTATIONS.get(deviceOrientation); 
    return (sensorOrientation + deviceOrientation + 360) % 360; 
} 

Или используйте свою собственную логику/реализацию.

Для вашего captureRequestBuilder, который можно использовать для захвата изображения, установите JPEG_ORIENTATION следующим образом:

int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, sensorToDevice(cameraCharacteristics, rotation)); 

Это, как я захватить мои изображения в моем приложении, и мои сохраненные изображения правильно повернуты! Если вы это сделаете, я бы предложил вам добавить свой код, чтобы на самом деле сделать снимок, а не только ваш сеанс предварительного просмотра.

Надеюсь, что это поможет!

+0

Предварительный просмотр не является нормальным, и все в порядке. Но когда я беру «Фото» (получаю текущий кадр через ImageReader), он поворачивается на 90 градусов. Я уже использую метод преобразования configure для правильного отображения предварительного просмотра. –

+0

Вы вызываете captureBuilder.set (CaptureRequest.JPEG_ORIENTATION, getOrientation (вращение)); – greenteafox

+0

С правильным вращением? Некоторое вращение камеры составляет 90, например, ваш мобильный телефон, а некоторые другие - 270. – greenteafox

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