2016-06-27 4 views
2

Ich versuche, in der manuellen Kamera Controls neue Belichtungswert und ISO-Werte hinzuzufügen. Ich verwende das Camera2Basic Beispiel. Das Problem, dem ich jetzt gegenüberstehe, ist, dass ich neu in Android bin. Ich habe versucht, L-Camera anzuschauen, aber es ist in Scala und das verwirrt mich weiter.Steuerung Sensor ISO und Belichtungszeit in android Kamera2API

Ich habe versucht, die folgenden Änderungen, aber es gab keine Aktualisierung der Vorschau des Bildes.

private void createCameraPreviewSession() { 
    try { 
     SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
     assert texture != null; 

     // We configure the size of default buffer to be the size of camera preview we want. 
     texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 

     // This is the output Surface we need to start preview. 
     Surface surface = new Surface(texture); 

     // We set up a CaptureRequest.Builder with the output Surface. 
     mPreviewRequestBuilder 
       = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     mPreviewRequestBuilder.addTarget(surface); 

     // Here, we create a CameraCaptureSession for camera preview. 
     mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 
       new CameraCaptureSession.StateCallback() { 

        @Override 
        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
         // The camera is already closed 
         if (null == mCameraDevice) { 
          return; 
         } 

         // When the session is ready, we start displaying the preview. 
         mCaptureSession = cameraCaptureSession; 
         try { 
          // Auto focus should be continuous for camera preview. 
          mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 

          mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
            CaptureRequest.CONTROL_AE_MODE_OFF); 

          mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME,Long.valueOf("100000")); 
          mPreviewRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY,1600); 

          // Flash is automatically enabled when necessary. 
          setAutoFlash(mPreviewRequestBuilder); 

          // Finally, we start displaying the camera preview. 
          mPreviewRequest = mPreviewRequestBuilder.build(); 
          mCaptureSession.setRepeatingRequest(mPreviewRequest, 
            mCaptureCallback, mBackgroundHandler); 
         } catch (CameraAccessException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onConfigureFailed(
          @NonNull CameraCaptureSession cameraCaptureSession) { 
         showToast("Failed"); 
        } 
       }, null 
     ); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

Antwort

3

Zunächst müssen Sie Ihre Vorlage TEMPLATE_STILL_CAPTURE oder TEMPLATE_MANUAL ändern sich die Werte ändern, in der Vorschau zu sehen. Denken Sie auch daran, CONTROL_AE_MODE und 'CONTROL_MODE' auf OFF zu stellen.

Diese Steuerung ist nur wirksam, wenn android.control.aeMode oder android.control.mode auf OFF gesetzt ist; Andernfalls überschreibt der automatische Belichtungsalgorithmus diesen Wert.

Von Android Developer

Zweitens stellen Sie Ihre Werte mit:

builder.set(CaptureRequest.SENSOR_SENSITIVITY, isoValue); 
builder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposureTimeValueInMilliseconds); 

Schließlich, nachdem alle Änderungen vergessen Sie nicht Ihre Vorschau zu aktualisieren, indem ein CaptureSession.setRepeatingRequest

Hoffe, es wird dazu beitragen, Sie!

+0

Nur einen kurzen Punkt, den ich hatte gehalten . Die Belichtungszeit wird nicht in Millisekunden, sondern in Nanosekunden gemessen. – mail929

0

Also habe ich die folgenden Änderungen an meinem Code vorgenommen.

mPreviewRequestBuilder 
    = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_MANUAL); 
mPreviewRequestBuilder.addTarget(surface); 


mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, 
    CaptureRequest.CONTROL_MODE_OFF); 

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
    CaptureRequest.CONTROL_AE_MODE_OFF); 

mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME,Long.valueOf("22000")); 
mPreviewRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY,200); 

mCaptureSession.setRepeatingRequest(mPreviewRequest, 
    mCaptureCallback, mBackgroundHandler); 

Allerdings bekomme ich eine seltsame Vorschau mit viel grünem Licht als Eingabe.

Hier wird https://postimg.org/image/yl95e6qht/

Dies ist, wie es mit meiner eingebauten Kamera app aussieht: https://postimg.org/image/lvjnwquj5/

+0

Auf auto "CONTROL_AWB_MODE" setzen oder deaktivieren. –

+0

hat es für dich funktioniert? –

+0

Nein, tat es nicht. Ich denke, es ist etwas mit der Bildrate zu tun. Muss ich das einstellen? Kann ich dich irgendwo mit meinen Zweifeln kontaktieren? – InquisitiveCoder

0

Dies wird das Problem beheben:

mPreviewBuilder.set(
    CaptureRequest.CONTROL_AWB_MODE, 
    CaptureRequest.CONTROL_AWB_MODE_AUTO 
);