使用Camera2 API连续拍照

问题描述

我正在一个项目中,我需要以一定的分辨率,质量和等待时间不断拍照。用户可以开始/停止捕获图片,还可以在预览或不预览的情况下运行图片(就像用手机进行其他操作一样)。

在大多数情况下,大多数时间,我都能正常工作,但是在某些奇怪的情况下,我看到的照片质量不好/模糊不清。值得一提的是,该设备正在移动。

这是我当前的请求:

private fun setRequestParams(builder: CaptureRequest.Builder) {
        builder.set(CaptureRequest.BLACK_LEVEL_LOCK,false)
        builder.set(CaptureRequest.CONTROL_AWB_LOCK,false)
        builder.set(CaptureRequest.CONTROL_AWB_MODE,CaptureRequest.CONTROL_AWB_MODE_AUTO)
        builder.set(CaptureRequest.CONTROL_AE_LOCK,false)
        builder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON)
        builder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE,CaptureRequest.CONTROL_AE_ANTIBANDING_MODE_AUTO)
        builder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,0)
        builder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,0)
        builder.set(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_AUTO)
        builder.set(CaptureRequest.COLOR_CORRECTION_MODE,CaptureRequest.CONTROL_MODE_AUTO)
        builder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,CaptureRequest.CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG)
        builder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
        builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange())
        builder.set(CaptureRequest.JPEG_QUALITY,pictureConfig.quality.toByte())
        val capabilities = cameracharacteristics?.get(Cameracharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
        val isManualFocusSupported : Boolean? = capabilities?.contains(Cameracharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)
        if (isManualFocusSupported != null && isManualFocusSupported ) {
            builder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_OFF)
            builder.set(CaptureRequest.LENS_FOCUS_disTANCE,0.0f)
        }
    }

如上所述,用户可以在前景或背景上捕获照片,为此我创建了3个请求,我意识到在某些手机中,如果没有链接的Surface,相机会自动关闭,这就是我使用dummyView的原因。 / p>

private val previewRequest: CaptureRequest by lazy {
        captureSession!!.device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
            addTarget(preview!!)
            setRequestParams(this)
        }.build()
    }
    private val backgroundPreviewRequest : CaptureRequest by lazy {
        captureSession!!.device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
            addTarget(dummyPreview!!)
        }.build()
    }
    private val captureRequest: CaptureRequest by lazy {
        captureSession!!.device.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).apply {
            addTarget(imageReader!!.surface)
            setRequestParams(this)
        }.build()
    }

一切准备就绪后,我会拍照:

captureSession?.setRepeatingRequest(previewRequest,null,cameraPreviewHandler)
captureSession?.capture(captureRequest,cameraHandler)

调用onImageAvailable时,我再次捕获。有时我会保存图像,但是如果捕获是在 waiting 期间,我就让它继续。通常等待时间为400毫秒。

我的问题是:

  1. 我的照片有时模糊不清,有时(在同一拍摄会话中)没有,请问有什么需要改进的地方吗?
  2. 类似型号的电话(SM-A705FN)给出的结果不一致。当另一部手机取得良好效果时,同一部手机会产生部分模糊的图像。相机的硬件是否可能被过度使用?
  3. 在某些手机中,相机会停止拍照,而不会调用相机错误回调。有没有办法知道我的照片在某处丢失了?
  4. 在某些手机中,我的代码根本无法工作,例如三星A7,但在三星A10(功能较弱)上却可以工作

PS:我使用的 repeatingRequest 具有几乎相同的请求参数,但发现即使输出稍高(拍摄速度更快),质量也较差。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...