我正在研究新的 CameraX API,以了解从我们当前的 Camera2 系统切换的可行性。
在我们的 Camera2 系统中,我们使用 OpenGL 表面从 PreviewCaptureSession 捕获帧,并且我们在大多数设备上达到一致的 30fps 图像处理速度,有些能够在启用 AutoExposure 设置的情况下达到 60fps。
CameraX 没有提供接近该速度的任何东西,我不确定它是否是我在设置中遗漏的东西。
我已经为 CameraX 和 ImageAnalysis 设置了测试示例,但是我正在锁定通过图像数量的帧速率。
例如,我可以将分辨率设置为低至 320x240 到 1920x960,并且两者都会以(看似上限)16fps 的速度出现。
当我添加一个预览用例与它一起运行并设置 enableTorch(true) 时,ImageAnalysis 用例将突然开始变得更像 20fps,它偶尔会达到 30ish。
显然预览用例改变了相机的一些 AutoExposure 状态?
这是我当前设置的狙击手......
private fun startCameraAnalysis() {
val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
var resolution = Size(metrics.widthPixels, metrics.heightPixels)
resolution = Size(640, 480) //set to fixed size for testing
val aspectRatio = Rational(resolution.width, resolution.height)
val rotation = viewFinder.display.rotation
// Setup image analysis pipeline
val analyzerConfig = ImageAnalysisConfig.Builder().apply {
val analyzerThread = HandlerThread(
"LuminosityAnalysis").apply { start() }
setCallbackHandler(Handler(analyzerThread.looper))
setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
setTargetRotation(rotation)
setTargetAspectRatio(aspectRatio)
setTargetResolution(resolution)
}.build()
// Setup preview pipeline
val previewConfig = PreviewConfig.Builder().apply {
setTargetRotation(rotation)
setTargetAspectRatio(aspectRatio)
setTargetResolution(resolution)
}.build()
// Build Preview useCase
val preview = Preview(previewConfig)
preview.enableTorch(true)
// Build Analysis useCase
val analyzer = ImageAnalysis(analyzerConfig)
analyzer.analyzer = LuminosityAnalyzer()
CameraX.bindToLifecycle(this, preview, analyzer )
preview.enableTorch(true)
}
无论如何,是否可以在 ImageAnalysis 周围更改 CameraX 中的相机设置以获得更高的帧速率?
无论如何,实际上是否可以改变诸如传感器持续时间、ISO、曝光之类的东西?
最佳答案
因此,我花了更多时间进行调查,并且我想我现在已经提出了一个解决方案。
事实证明,ImageAnalysisConfig是不可扩展的,因此仅使用其中一种时就无法更改摄像头配置,因此将使用默认摄像头设置,在我的手机上,我认为这会导致AE开启并达到16ish FPS。
如果旋转PreviewConfig使其同时运行,则可以使用Camera2Config.Extender对其进行扩展,并直接更改camera2属性。这可以提高相机预览的帧速率,并且分析仪也将开始以相同的速率获取帧。
因此,例如,我将其添加到我的PreviewConfig ...
// Create Camera2 extender
var camera2Extender = Camera2Config.Extender(previewConfig)
.setCaptureRequestOption(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF)
.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
.setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
.setCaptureRequestOption(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF)
.setCaptureRequestOption(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
.setCaptureRequestOption(CaptureRequest.SENSOR_SENSITIVITY, 100)
.setCaptureRequestOption(CaptureRequest.SENSOR_FRAME_DURATION, 16666666)
.setCaptureRequestOption(CaptureRequest.SENSOR_EXPOSURE_TIME, 20400000)
因此,这开始在ImageAnalyser中达到30fps的罚款。
如果我想达到60,我可以设置...
.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
.setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range(60,60))
显然,假设设备支持(60,60)的目标FPS范围。
因此,似乎完整的Camera2逻辑在CameraX中仍然可用,这有点笨拙,因为它有点隐藏在Camera2Config扩展器中,并且仅适用于Preview用例。
关于android - 如何使用 Android CameraX ImageAnalysis 提高帧率?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57485050/