我有一个使用 CameraX API 和
Preview
和 Analyzer
用例的应用程序。
我使用
Camera2Interop.Extender()
设置所需的 FPS,并将 CONTROL_AE_TARGET_FPS_RANGE
选项设置为 Range(60,60)
例如
val previewBuilder = Preview.Builder()
.setTargetResolution(currentRes)
...
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(cameraLens)
.build()
val fps = ConfigurationService.fps.toInt() // 60
val frameDuration = 1000000000L/fps // 1666666
if (cameraSelector.lensFacing!! == CameraSelector.LENS_FACING_FRONT) {
Camera2Interop.Extender(previewBuilder)
.setCaptureRequestOption(
CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
Range(fps, fps))
.setCaptureRequestOption(
CaptureRequest.SENSOR_FRAME_DURATION,
frameDuration
)
}
然后设置预览和分析器
val preview = previewBuilder.build()
val analysis = ImageAnalysis.Builder()
.setTargetResolution(currentRes)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.setOutputImageFormat(ConfigurationService.cameraInputType)
.setImageQueueDepth(countOfCores)
.build()
analysis.setAnalyzer(Executors.newWorkStealingPool(Runtime.getRuntime().availableProcessors()), analyzer)
val useCaseGroup = UseCaseGroup.Builder()
.addUseCase(preview)
.addUseCase(analysis)
.build()
try {
cameraProvider?.unbindAll()
camera = cameraProvider?.bindToLifecycle(
context as LifecycleOwner,
cameraSelector,
useCaseGroup
)
previewView.implementationMode = PreviewView.ImplementationMode.PERFORMANCE
preview.setSurfaceProvider(
previewView.surfaceProvider
)
} catch (e: Exception) {
Log.e("CameraClassificationWrapper", "Use case binding failed", e)
}
我面临的问题是,当 FPS 设置为高于 30 时,传入的图像在这种情况下仍然具有正确的宽度/高度 (1280x720),但它似乎是从传感器的一部分中裁剪出来的,导致图像显示为“放大”。对于少于 30 的图像似乎是正确的。
由于我使用分析仪使用校准相机针对特定分辨率进行实际测量,因此我需要图像与我校准的图像相匹配。
我看到多次提到其他平台或仅针对一般用例的此类问题。
我知道
Camera2
有CameraConstrainedHighSpeedCaptureSession
方式,我会使用它,除非整个应用程序已经使用CameraX
而且我真的很想避免更换整个相机后端
有没有办法使用 CameraX 以 60 FPS 获得全分辨率(高达 1080p)?
该设备真的声称支持 60fps 吗?也就是说,AVAILABLE_TARGET_FPS_RANGES列出
[60,60]
吗?
如果没有,尝试设置它可能会导致意外行为,例如您所看到的情况。
如果列出了,那么不幸的是您正在测试的设备有一个错误; FOV 不应根据请求的帧速率而改变。
顺便说明一下,如果将
CaptureRequest.SENSOR_FRAME_DURATION
保留为默认值 CaptureRequest.CONTROL_AE_MODE
,则设置 ON
不会执行任何操作。仅在禁用自动曝光时才有效。所以你不妨删除它以简化你的代码。相反,如果您将 AE_MODE
设置为 OFF
,那么 CONTROL_TARGET_FPS_RANGE
将不会执行任何操作。