当前位置: 首页 > 知识库问答 >
问题:

如何使用Android CameraX自动对焦

齐承运
2023-03-14

Android最近几个月发布了一款新的应用编程接口相机。我正在努力理解如何让相机自动对焦。

https://groups.google.com/a/android.com/forum/#!searchin/camerax developers/auto$20focus | sort:date/camerax developers/IQ3KZd8iOIY/LIbrRIqEBgAJ

这里是关于这个话题的讨论,但几乎没有具体的留档。

https://github.com/android/camera-samples/tree/master/CameraXBasic/app/src/main/java/com/android/example/cameraxbasic

这里也是基本的相机应用程序,但我找不到任何文件处理自动对焦。

任何有关文档的提示或要点都很有帮助。另外,我对android还比较陌生,所以很可能我遗漏了一些使上述链接更有用的东西。

共有3个答案

秦伯寅
2023-03-14

只需指出,要使用PreviewView获得“点击聚焦”,您需要使用DisplayOrientedMeteringPointFactory。否则你会搞砸坐标。

val factory = DisplayOrientedMeteringPointFactory(activity.display, camera.cameraInfo, previewView.width.toFloat(), previewView.height.toFloat())

其余的用MatPag的答案。

宁弘亮
2023-03-14

一些Android设备存在问题,相机不能用相机自动对焦。相机团队意识到了这一点,并正在用内部票据跟踪它,希望很快能得到修复。

崔琦
2023-03-14

使用当前的Cameron aX1.0.0,您可以通过以下两种方式进行操作:

>

  • 每X秒自动对焦:

     previewView.afterMeasured {
         val autoFocusPoint = SurfaceOrientedMeteringPointFactory(1f, 1f)
                 .createPoint(.5f, .5f)
         try {
             val autoFocusAction = FocusMeteringAction.Builder(
                 autoFocusPoint,
                 FocusMeteringAction.FLAG_AF
             ).apply {
                 //start auto-focusing after 2 seconds
                 setAutoCancelDuration(2, TimeUnit.SECONDS)
             }.build()
             camera.cameraControl.startFocusAndMetering(autoFocusAction)
         } catch (e: CameraInfoUnavailableException) {
             Log.d("ERROR", "cannot access camera", e)
         }
     }
    

    关注tap:

     previewView.afterMeasured {
         previewView.setOnTouchListener { _, event ->
             return@setOnTouchListener when (event.action) {
                 MotionEvent.ACTION_DOWN -> {
                     true
                 }
                 MotionEvent.ACTION_UP -> {
                     val factory: MeteringPointFactory = SurfaceOrientedMeteringPointFactory(
                         previewView.width.toFloat(), previewView.height.toFloat()
                     )
                     val autoFocusPoint = factory.createPoint(event.x, event.y)
                     try {
                         camera.cameraControl.startFocusAndMetering(
                             FocusMeteringAction.Builder(
                                 autoFocusPoint,
                                 FocusMeteringAction.FLAG_AF
                             ).apply {
                                 //focus only when the user tap the preview
                                 disableAutoCancel()
                             }.build()
                         )
                     } catch (e: CameraInfoUnavailableException) {
                         Log.d("ERROR", "cannot access camera", e)
                     }
                     true
                 }
                 else -> false // Unhandled event.
             }
         }
     }
    

    afterMeasured扩展函数是一个简单实用程序:(感谢ch271828n对其进行改进)

    inline fun View.afterMeasured(crossinline block: () -> Unit) {
        if (measuredWidth > 0 && measuredHeight > 0) {
            block()
        } else {
            viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.GlobalLayoutListener {
                override fun onGlobalLayout() {
                    if (measuredWidth > 0 && measuredHeight > 0) {
                        viewTreeObserver.removeOnGlobalLayoutListener(this)
                        block()
                    } 
                }
            })
        }
    }
    

    摄像机对象可以通过

    val camera = cameraProvider.bindToLifecycle(
        this@Activity, cameraSelector, previewView //this is a PreviewView
    )
    

  •  类似资料:
    • 问题内容: 假设,我需要在特定的网站上执行一组过程,例如,填写一些表格,单击“提交”按钮,将数据发送回服务器,接收响应,再次基于响应执行一些操作,然后将数据发送回服务器网站的。我知道python中有一个webbrowser模块,但是我想这样做而不调用任何Web浏览器。它不必是一个纯脚本。 在python中有可用的模块可以帮助我做到这一点吗? 谢谢 问题答案: 您也可以看看机械化。它的意思是处理 “

    • 我有一个bean,我必须自己创建它(使用),它有和注释。 如何让Spring处理我的bean中的这些注释? 相关问题: 在Spring,我可以从自动编织的豆子里自动编织新的豆子吗?

    • 嘿,我尝试使用此代码自动创建docker容器 但我也得到了这个错误内部服务器错误(“OCI运行时创建失败:container\u linux。go:370:启动容器进程导致:exec:“git clone”:stat git clone:没有这样的文件或目录:未知”) 有什么方法可以解决这个问题吗?或者有其他方法吗?

    • 启动Apache Spark集群通常是通过代码库提供的spark-submit shell脚本完成的。但问题是,每次集群关闭并重新启动时,您都需要执行那些shell脚本来启动spark集群。 我也对其他解决方案持开放态度。

    • 问题内容: 将内容添加到ListView时,我希望它自动向下滚动。 我正在使用SwiftUI 和a 作为控制器。新数据将追加到列表中。 当我将新数据追加到消息列表时,我希望列表向下滚动。但是,我必须手动向下滚动。 问题答案: 更新:在iOS 14中,现在有一种本机方式可以执行此操作。我正在这样做 对于iOS 13及以下版本,您可以尝试: 我发现翻转视图对我来说似乎很好。这将在底部启动ScrollV

    • 问题内容: 我有兴趣在JFrame中提供自动补全框。触发机制将基于助记符(我认为),但是我不太确定“自动补全框”应使用什么(我希望在用户按下键时对结果进行过滤)。 您将如何实施?某种JFrame还是JPopupMenu? 我想知道这是如何实现的,所以请不要发布指向可用的[J] Components的链接。 问题答案: Sun的教程“使用Swing组件”中提供了 一个自动完成文本区域 的示例 。 它