我正在研究新的CameraX API,与从我们当前的Camera2系统切换过来的可行性有关。
在我们的Camera2系统中,我们使用OpenGL surface从PreviewCaptureSession中捕获帧,并且我们在大多数设备上达到了一致的30fps图像处理速度,有些设备在启用自动曝光设置的情况下能够达到60fps。
CameraX没有给出任何接近这个速度的东西,我不确定是不是我错过了设置。
我已经为CameraX和ImageAnalysis设置了测试示例,但我得到的帧率对通过的图像数量是锁定的。
例如,我可以将分辨率低至320x240至1920x960,并且两者都将以16fps(似乎有上限)出现。
当我添加一个预览用例并设置enableTorch(真)时,ImageAnalysis用例会突然开始变得更接近20fps,偶尔会达到30ish的峰值。
很明显,预览会改变相机的自动曝光状态?
这是我当前设置的一个片段...
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)
}
在CameraX的图像分析中,有没有改变相机设置以获得更高的帧率?
是否有任何改变的东西,如传感器持续时间,ISO和曝光?
好吧,这把我逼疯了好几个小时。
扩展伊恩的答案为最新版本的CameraX,你现在可以直接扩展图像分析。参见CameraX与Camera2的CaptureRequest相当
所以要得到60fps,我们可以使用这个修改过的代码(Java的例子):
ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
Camera2Interop.Extender ext = new Camera2Interop.Extender<>(builder);
ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<Integer>(60, 60));
ImageAnalysis imageAnalysis = builder.build();
所以我花了更多的时间来调查,我想我现在已经想出了一个解决方案。
结果是,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)
所以在图像分析器中它开始达到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范围。
因此,在CameraX中似乎仍然可以使用完整的Camera2逻辑,只是有点笨拙,它被隐藏在Camera2Config扩展器中,这只适用于预览用例。
问题内容: 我的目标是使我们的Redis服务器在生产中达到约80%的CPU利用率。通过确保我们不会利用CPU不足,同时为增长和高峰留出一些空间,这将有益于后端服务器设计。 使用Redis自己的基准测试工具时,很容易达到100%的CPU使用率: 在此基准上,我们分配了50个客户端以将1,000,000个请求推送到我们的Redis服务器。 但是在使用其他客户端工具(例如redis-lua或webdis
我有一堆从Youtube下载的视频,我想从他们中提取帧。我使用的当前命令是: 但是我还想设置-r和-t选项。我想要的fps是每个视频的fps,持续时间是他们的持续时间。我知道如果我不设置-r选项,默认值是25 fps。
本文向大家介绍如何使用JS console.log()技巧提高工作效率,包括了如何使用JS console.log()技巧提高工作效率的使用技巧和注意事项,需要的朋友参考一下 我们知道 console.log(message)用法很简单,表示将参数message 打印到控制台上。 console.log('前端小智') // 前端小智 const myAge = 28 console.log(my
本文向大家介绍如何利用FutureBuilder提高开发效率,包括了如何利用FutureBuilder提高开发效率的使用技巧和注意事项,需要的朋友参考一下 常见场景 展示请求按钮 用户点击按钮,显示loading 展示数据或者错误 抽象模式 展示请求按钮(初始状态) 用户点击按钮,显示loading(请求中状态) 展示数据或者错误 (结束状态(成功或失败)) 转换成程序语言 以上三种现实情况对应
问题内容: 我正在编写一些可调用的代码,并且执行了数千次。显然,由于反射,这非常慢。 我想看看是否可以在Java 7中使用以提高性能。到目前为止,这里是我所拥有的: 代替,我在做: 但是,这似乎并不比使用反射的Field.set调用更好。我在这里做错什么了吗? 我读到使用可能会更快,但是当我尝试使用它时,得到了。 有谁成功地优化了对Field.set或Field.get的重复调用? 问题答案: 2