我有一个应用程序,我试图通过 Android 智能手机的闪光灯将最大可能的光能传递给对象。
在使用几部手机进行的实验室测量中,我们观察到在拍摄自动曝光照片时闪光灯的光输出可能明显高于稳态手电筒开启(当然这取决于设备)。如果可以在更高的输出电平下触发闪光灯,无论外部照明条件如何,并且在某些情况下以可靠、足够高的频率(5 Hz?),那么在某些情况下可以输出更多的光而不只是让手电筒保持稳定状态。
不幸的是,似乎不可能实现对闪光灯的这种精细控制,我猜是因为闪光灯的强度控制(除了手电筒)与自动曝光控制的关联非常低。
在使用以下请求预览帧时,我已经能够让闪光灯触发:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_OFF);
mPreviewRequestBuilder.set( CaptureRequest.FLASH_MODE,
CaptureRequest.FLASH_MODE_SINGLE );
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
CaptureRequest
.CONTROL_AE_PRECAPTURE_TRIGGER_START);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_OFF);
// Finally, we start displaying the camera preview.
mPreviewRequest = mPreviewRequestBuilder.build();
setState( STATE_PREVIEW );
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
当捕获结果返回时,FLASH_STATE_FIRED
我使用以下命令进行单个静止图像捕获:
final CaptureRequest.Builder captureBuilder =
mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(surface);
// Use the same AE and AF modes as the preview.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
captureBuilder.set( CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF );
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_OFF);
mCaptureSession.stopRepeating();
mCaptureSession.capture(captureBuilder.build(), mCaptureCallback, null);
似乎需要重置闪光灯。然后我回到上面的预览代码再次闪光,但是闪光灯非常间歇地闪光。
除了简单地打开和关闭手电筒之外,有没有更好的方法来使用 Camera2 接口产生高度一致、高频、高输出的闪光?