在最新的 alpha ( alpha08
) 中,我似乎无法弄清楚如何正确配置所有内容以便我的Analyzer
正常运行。我可以看到它工作一次,然后它再也不会运行了。
由于各种原因,我需要使用 aTextureView
所以我不能交换到CameraView
等。
我几乎肯定这是由于与期货相关的事情,但我似乎无法确定。
我的想法很新鲜。任何想法/帮助表示赞赏。
我已经Application
使用以下内容配置了我的课程:
override fun getCameraXConfig(): CameraXConfig {
return Camera2Config.defaultConfig()
}
Run Code Online (Sandbox Code Playgroud)
然后以下是我的MainActivity
代码(布局只是 a 中的TextureView
一个ConstraintLayout
):
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.util.Size
import android.view.Surface
import android.view.TextureView
import androidx.camera.core.*
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.concurrent.futures.CallbackToFutureAdapter
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.google.common.util.concurrent.ListenableFuture
import java.util.concurrent.Executors
class MainActivity : AppCompatActivity() {
private lateinit var viewFinder: TextureView
private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider> …
Run Code Online (Sandbox Code Playgroud) 从 更新到 后,androidx.camera:camera-view:1.0.0-alpha32
我androidx.camera:camera-view:1.1.0-beta01
在使用时收到下一个错误CameraX
camerax_version = "1.0.2"
// CameraX
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:1.1.0-beta01"
Run Code Online (Sandbox Code Playgroud)
错误
java.lang.IllegalStateException: CameraX is not configured properly. The most likely cause is you did not include a default implementation in your build such as 'camera-camera2'.
at androidx.camera.core.CameraX.<init>(CameraX.java:109)
at androidx.camera.lifecycle.ProcessCameraProvider.getOrCreateCameraXInstance(ProcessCameraProvider.java:181)
at androidx.camera.lifecycle.ProcessCameraProvider.getInstance(ProcessCameraProvider.java:167)
Run Code Online (Sandbox Code Playgroud) 我将CameraX
的分析器用例与 MLKit 的BarcodeScanner
. 我想先裁剪从相机接收到的图像的一部分,然后再将其传递到扫描仪。
我现在正在做的是将ImageProxy
(我在分析器中收到的)转换为Bitmap
,裁剪它,然后将其传递给BarcodeScanner
. 缺点是这不是一个非常快速和有效的过程。
我还注意到运行此代码时 Logcat 中收到的警告:
ML Kit 检测到您似乎将相机帧作为位图对象传递给检测器。这是低效的。请对camera2 API使用YUV_420_888格式,对(旧)相机API使用NV21格式,并将字节数组直接传递给ML Kit。
不进行转换固然很好ImageProxy
,但是如何裁剪我想要分析的矩形呢?
我已经尝试过设置(imageProxy.image.cropRect) 类cropRect
的字段Image
,但它似乎并不影响最终结果。
android android-image android-camera2 android-camerax google-mlkit
我正在尝试使用 CameraX API 来获取照片,但是在我更新到新的 API 版本 1.0.0-alpha06 后,它开始崩溃
CameraX.bindToLifecycle(...)
Run Code Online (Sandbox Code Playgroud)
方法。
错误日志是:
Process: com.aximetria.aximetria.debug, PID: 2629
java.lang.BootstrapMethodError: Exception from call site #2 bootstrap method
at androidx.camera.core.Preview.updateListener(Preview.java:368)
at androidx.camera.core.Preview.updateOutput(Preview.java:586)
at androidx.camera.core.Preview.updateConfigAndOutput(Preview.java:363)
at androidx.camera.core.Preview.onSuggestedResolutionUpdated(Preview.java:524)
at androidx.camera.core.UseCase.updateSuggestedResolution(UseCase.java:408)
at androidx.camera.core.CameraX.calculateSuggestedResolutions(CameraX.java:684)
at androidx.camera.core.CameraX.bindToLifecycle(CameraX.java:195)
at com.aximetria.aximetria.ui.main.profile.avatar.TakeAvatarPhotoFragment.initCamera(TakeAvatarPhotoFragment.kt:169)
at com.aximetria.aximetria.ui.main.profile.avatar.TakeAvatarPhotoFragment.initCamera$default(TakeAvatarPhotoFragment.kt:117)
at com.aximetria.aximetria.ui.main.profile.avatar.TakeAvatarPhotoFragment$onViewCreated$1.onPermissionsChecked(TakeAvatarPhotoFragment.kt:55)
...
Run Code Online (Sandbox Code Playgroud)
我的代码是:
private fun initCamera(reverseFacing: Boolean = false) {
...
val previewConfig = PreviewConfig.Builder()
.setTargetAspectRatio(AspectRatio.RATIO_4_3)
.setLensFacing(lensFacing)
.build()
val preview = Preview(previewConfig)
preview.setOnPreviewOutputUpdateListener { previewOutput ->
val parent = binding.preview.parent as ViewGroup
parent.removeView(binding.preview)
parent.addView(binding.preview, 0)
binding.preview.surfaceTexture = previewOutput.surfaceTexture …
Run Code Online (Sandbox Code Playgroud) 我已经开始探索 CameraX 库以及示例应用程序,并且注意到管理生命周期方面存在一些不一致之处。
在本主题中,我将仅讨论预览用例,因为它主要与生命周期相关。
在示例应用程序中, in CameraFragment
,用例绑定到CameraX
inonViewCreated
并取消绑定 in onDestroyView
。unbind
第一个问题是,如果我们传递LifecycleOwner
给方法,我们是否必须使用用例bind
?我们可以将它们绑定起来onCreate
并将生命周期管理留给 吗CameraX
?
我还尝试遵循入门教程,其中SurfaceTexture
的TextureView
刚刚被替换。在示例应用程序中,TextureView
首先从父级中删除,然后添加,然后SurfaceTexture
替换。我们必须这样做吗?是什么原因?
另一件事是,在示例应用程序中,用例是从view.post { }
方法绑定的。我在这种方法中遇到了很多问题,因为在将片段放在后台堆栈上、替换为另一个片段并重新创建之后,CameraX 记录了许多消息:
E/CamX: [ERROR][STATS_AEC] aec_led_calibration.cpp:560: aec_led_cal_apply_calibration Invalid pointer 0x7921174000 0x0
E/CamX: [ERROR][STATS_AEC] aec_set.cpp:1346: aec_set_fps_range Aec_Error invalid input 414 E/CamX: [ERROR][STATS_AEC] camxcaecstatsprocessor.cpp:1671 SetAlgoBayerHistValue() Unsupported bayer hist channel!
E/CamX: [ERROR][STATS ] camxcaecstatsprocessor.cpp:3194 ProcessRequestFastAE() [FastAE] Failed to apply gain to …
Run Code Online (Sandbox Code Playgroud) java.lang.IllegalArgumentException:找不到相机设备支持的表面组合 - Id:0。可能试图绑定太多用例。
为什么bindToLifecycle()
只能选择 imageCapture
or videoCapture
?
CameraX.bindToLifecycle(lifecycleOwner, mPreview, imageCapture,videoCapture)
Run Code Online (Sandbox Code Playgroud) 我正在尝试像在 Camera2 API 中一样对 CameraX 进行手动对焦
在 Camera2 API 中,我使用以下代码
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, mLensFocusDistance);
Run Code Online (Sandbox Code Playgroud)
android camera X 可以手动对焦吗?如果是这样如何
提前致谢
我有一个自定义相机应用程序,它具有居中的矩形视图,如下所示:
当我拍照时,我想忽略矩形外的所有内容。这是我的 XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black_50">
<TextureView
android:id="@+id/viewFinder"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_margin="16dp"
android:background="@drawable/rectangle"
app:layout_constraintBottom_toTopOf="@+id/cameraBottomView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/cameraBottomView"
android:layout_width="match_parent"
android:layout_height="130dp"
android:background="@color/black_50"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageButton
android:id="@+id/cameraCaptureImageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:src="@drawable/ic_capture_image"
app:layout_constraintBottom_toBottomOf="@id/cameraBottomView"
app:layout_constraintEnd_toEndOf="@id/cameraBottomView"
app:layout_constraintStart_toStartOf="@id/cameraBottomView"
app:layout_constraintTop_toTopOf="@id/cameraBottomView"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
这是我用于 cameraX 预览的 kotlin 代码:
class CameraFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the …
Run Code Online (Sandbox Code Playgroud) 我正在使用FirebaseVision
对象检测从CameraX
相机预览中检测事物。它正在检测找到的东西,但我试图绘制通过相机预览检测到的项目的边界框。这样做时,firebase 返回的边界框不适用于图像本身,而不是它们出现在错误位置的预览视图。
我从 firebase 返回的图像大小是1200x1600
,预览大小是2425x1440
如何将从 firebase 返回的边界框转换为正确的屏幕坐标?
我已经按照 Google CameraX代码实验室来实现自定义相机。相机预览很好,但是当我在旋转图像捕获图像后拍摄图像时。我正在以纵向模式拍摄图像,但保存的图像是横向的。这是配置相机的方法
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder()
.setTargetRotation(this.windowManager.defaultDisplay.rotation)
.build()
.also {
it.setSurfaceProvider(viewFinder.createSurfaceProvider())
}
imageCapture = ImageCapture.Builder()
.setTargetRotation(this.windowManager.defaultDisplay.rotation)
.build()
val imageAnalyzer = ImageAnalysis.Builder()
.build()
.also {
it.setAnalyzer(cameraExecutor, LuminosityAnalyzer { luma ->
Log.d(TAG, "Average luminosity: $luma")
})
}
// Select back camera as a default
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try { …
Run Code Online (Sandbox Code Playgroud) android image-rotation android-orientation android-camera2 android-camerax
android-camerax ×10
android ×9
crash ×1
crop ×1
focus ×1
google-mlkit ×1
kotlin ×1
setfocus ×1