3

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

对于大多数设备,我大部分时间都可以正常工作,但在某些奇怪的情况下,我会看到糟糕/模糊的图片。值得一提的是,该设备正在移动。

这是我目前的要求:

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 的原因。

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,null, cameraHandler)

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

我的问题是:

  1. 我的照片有时模糊,有时不模糊(在同一个捕获会话中)是否有需要改进的地方?
  2. 类似型号的手机(SM-A705FN)给出的结果不一致。当另一部手机提供良好效果时,同一部手机会提供部分模糊的图像。相机的硬件是否可能被过度使用?
  3. 在某些手机中,相机会停止拍照,而不会调用相机错误回调。有没有办法知道我的照片在某个地方丢失了?
  4. 在某些手机中,我的代码根本不起作用,例如三星 A7,但它适用于三星 A10(功能较弱)

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

4

0 回答 0