2016-03-02 100 views
0

我正在写一个android应用程序,以在用户按下捕捉按钮时快速捕捉闪光/不闪光图像对。为了编写我的应用程序,我提到了Camera2Basic应用程序here使用Android Camera2快速捕捉闪光灯/不闪光图像API

从Android文档,我发现,闪光灯闪光时,预览请求建设者应该有AE_MODE设置为AE_MODE_ON_ALWAYS_FLASH

我用三个要求建设者:预览noflash闪光灯 三者的区别是:

  • 预览:AE_MODE设置为AE_MODE_ON_ALWAYS_FLASH和AF_MODE设置为CONTROL_AF_MODE_CONTINUOUS_PICTURE

  • noflash:AE_MODE设置为AE_MODE_ON

  • 闪光灯:AE_MODE设置为AE_MODE_ONALWAYS_FLASH

我使用的Nexus 5设备,我发现,捕获只是一个闪光的形象,一个人必须有预览窗口和flash builder,并使用上面的flash构建器提交一个静态捕获请求。使用这个序列,我总是得到适当的闪光图像中的Nexus 5的预闪总是自动处理。

来到原来的问题,获取一对闪光/无闪光图像的,我的步骤顺序如下:

  1. 在拍摄照片,我用预览建设者启动自动对焦触发器。

  2. 在自动对焦完成后,我提交两份静像拍摄请求返回使用noflash闪光灯建设者备份(第一noflash,然后闪

然而, 第一个我得到的图片是flash image不闪光图像。我不明白这种产出的逆转。

  1. JPEG的情况下:首先图像是总是一个正确的闪光图像第二图像是总是一个适当无闪光图像如下图所示:

闪光图像对应于使用noflash助洗剂请求提交: enter image description here

对应于使用闪光灯助洗剂请求提交无闪光图像: enter image description here

  • YUV_420_888案例:与JPEG中的相同,但是,noflash图像永远不合适。人们可以注意到白色条纹右侧以及不正确的颜色,也很嘈杂
  • 闪光图像对应使用noflash建设者要求提交: enter image description here

    不当noflash图像对应于使用闪光灯建设者要求提交: enter image description here

    关闭因为在YUV_420_888格式中两个图像被捕获到bac k回来,我添加一个预览之间的请求,以防止溢出。

    我的问题是:

    1. 为什么输出图像的顺序颠倒?

    2. 为什么YUV_420_888格式的无闪光图像不正确?

    请帮忙。

    +0

    恐怕每个设备在这种情况下都会有所不同。不要指望任何一个服务全部的序列,并且记住,即使在今天,许多设备也只是部分支持camera2 API。 –

    +0

    @AlexCohn:我认为你是对的。我在Galaxy S6上进行了测试,闪光灯仅闪光一次,闪光灯图像过度曝光。但是,在这些设备中也必须有合适的顺序来捕捉闪光灯图像 。 – kunal18

    +0

    'AE_MODE_ON_ALWAYS_FLASH'不适用于Galaxy S6 –

    回答

    1

    要确认几件事情:

    1. 确保触发条件只设置为开始为一个请求,而不是不断地
    2. 如果AE_MODE就是AE控制闪光者之一,FLASH_MODE是忽略;最好不要碰它,以防万一。
    3. 确保为最终捕获请求使用STILL_CAPTURE请求模板;否则主闪光灯预计不会闪光。
    4. 您应该可以在闪光灯请求后几乎立即提交第二个不闪光的STILL_CAPTURE请求(为了安全起见,请留下一个缓冲区请求,因为由于卷帘快门,主闪光灯可能会在一帧之前部分可见,闪光灯捕捉后);只需提交预览请求,然后使用AE_MODE_ON提交STILL_CAPTURE请求即可。
    5. 为获得最大速度,请勿捕捉JPEG图像;额外的编码时间可能会导致图像之间的延迟。使用YUV_420_888并自己创建JPEG。
    +0

    非常感谢您的帮助!我已经设法在Nexus 5上正确捕捉不闪光和闪光图像。我按照您的建议采用YUV_420_888格式进行捕捉。我正在使用2个捕捉构建器,并几乎同时提交2个请求(不闪光,然后闪光)。我在〜200 ms后获得了非闪存图像捕获回调,在〜350 ms后获得了闪存图像回调(2个不同的捕获回调)。因此,在捕捉不闪光图像〜150 ms后捕捉闪光图像。你有没有看到更多的即兴创作范围? – kunal18

    +0

    为什么不一起提交它们,用captureBurst(http://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html#captureBurst(java.util.List,android.hardware.camera2.CameraCaptureSession.CaptureCallback,android.os.Handler))?使闪光灯成为第一个闪光灯,并在中间添加一个预览请求,以防止闪光溢出。 –

    +0

    感谢您的建议。我试过了,但仍然有150毫秒的延迟!为了确认,我使用SystemClock.uptimeMillis()来获取捕获回调中的时间(以毫秒为单位)。所以,当我得到flash图像的回调时,我得到了以毫秒为单位的T1时间;接下来,当我得到无闪光图像的回调时,我获得了毫秒的T2时间。那么,我是否正确地说在捕获闪光图像的T2-T1毫秒后不闪光的图像被捕获? – kunal18