2016-12-01 2 views
0

Ich versuche, einige ImageProcessing auf dem aktuellen Frame der Vorschau in Android zu tun. Bei jedem anderen Smartphone funktioniert es ziemlich gut. Aber jetzt muss ich die App für das Nexus 5x zugänglich machen.Nexus 5x Frames von Vorschau sind gedreht Camera2

Dort bekomme ich ein um 180 Grad gedrehtes Bild aus der Vorschau. Wie kann ich das beheben? Hier mein Code meine Kamera und die Vorschau für die Einrichtung:

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

Vorschau:

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

Wie Sie sehen können, habe ich eine Bild zu erfassen, um das Update zu verwenden versucht, aber es nicht tat Hilfe bekomme ich immer noch ein gedrehtes Bild aus der Vorschau.

Wenn es möglich ist, möchte ich eine Lösung, die versucht, die Einstellungen der Kamera zu ändern. Ich möchte das Bild nicht selbst drehen, nachdem ich es durch den gebundenen ImageReader bekommen habe.

Antwort

0

Nach dem Verständnis Ihrer Frage würde ich versuchen, das Folgende zu tun, wenn Sie nicht bereits sind. Ich denke, dein Problem liegt nicht in deiner previewCaptureSession, sondern in deinem Code, um ein Foto zu machen.

Ich vermute, Sie verwenden einen anderen CaptureRequest.Builder mit der Vorlage CameraDevice.TEMPLATE_STILL_CAPTURE richtig.

Für diesen Builder müssen Sie die JPEG-Ausrichtung festlegen. Wie ich bereits in den Kommentaren sagte, haben einige Kamera-Geräte 90 ° und andere eine 270 ° -Drehung.

Um die richtige Ausrichtung festzulegen, implementieren Sie die folgenden zwei Schnipsel.

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

Oder verwenden Sie Ihre eigene Logik/Implementierung.

Für Ihre captureRequestBuilder, mit dem Sie Ihre Bilder verwenden, um zu erfassen, stellen Sie die JPEG_ORIENTATION wie folgt:

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

Dies ist, wie ich meine Bilder in meinem App erfassen und meine gespeicherten Bilder werden richtig gedreht! Wenn dies so ist, würde ich vorschlagen, dass Sie Ihren Code hinzufügen, um ein Bild zu machen, nicht nur Ihre Vorschau Session.

Hoffe, dass hilft!

+0

Nein, die Vorschau ist normal und in Ordnung. Aber wenn ich ein "Photo" mache (bekomme den aktuellen Frame durch einen ImageReader), wird es um 90 Grad gedreht. Ich verwende die configure transform-Methode bereits, um die Vorschau korrekt anzuzeigen. –

+0

Rufen Sie captureBuilder.set (CaptureRequest.JPEG_ORIENTATION, getOrientation (Rotation)); – greenteafox

+0

Mit der richtigen Rotation? Einige Kamera-Geräte-Rotationen sind 90, wie Ihr Nexus-Telefon und einige andere sind 270. – greenteafox

Verwandte Themen