标签: android-camerax

TFLite 的 Android Camera X ImageAnalyzer 图像格式

我正在尝试使用 CameraX api 使用 tflite 模型分析相机预览帧。

本文档描述了使用 ImageAnalyzer 处理传入帧。目前帧是作为 YUV 传入的,我不确定如何将 YUV 图像数据传递给需要形状输入 (BATCHxWIDTHxHEIGHTx3) 的 tflite 模型。在旧的 API 中,您可以指定预览输出格式并将其更改为 rgb,但是此页面特别说明“CameraX 以 YUV_420_888 格式生成图像”。

首先,我希望有人找到了一种将 RGB 传递给分析器而不是 YUV 的方法,其次,如果没有,有人可以建议一种将 YUV 图像传递给 TFLite 解释器的方法吗?传入的图像对象是 ImageProxy 类型,它有 3 个平面,Y、U 和 V。

android tensorflow-lite android-camerax

4
推荐指数
1
解决办法
906
查看次数

Android CameraX 分析图像流

我想分析图像帧流并对其进行一些计算。但是,对于 CameraX,ImageAnalysis 实现类似乎只被调用一次 - 在相机绑定上。

我的问题是:如何对连续的图像流进行分析——概念上类似于视频流?

以下是我的相机、预览和分析设置代码:

private void setPreview() {
    ListenableFuture<ProcessCameraProvider> instance = ProcessCameraProvider.getInstance(this);

    Activity self = this;
    instance.addListener(() -> {

        try {
            ProcessCameraProvider cameraProvider = instance.get();
            Preview preview = new Preview.Builder().build();


            ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();
            imageAnalysis.setAnalyzer(Executors.newFixedThreadPool(1),
                                                    new ImageAnalyser(new CameraLogListener() {
                                                        @Override
                                                        public void log(String msg) {
                                                            Log.e("Camera log", msg);
                                                        }
                                                    }));

            CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();

            cameraProvider.unbindAll();
            Camera camera = cameraProvider.bindToLifecycle(((LifecycleOwner)self), cameraSelector, preview, imageAnalysis);

            preview.setSurfaceProvider(
                    ((PreviewView)findViewById(R.id.cameraTextureView)).createSurfaceProvider(camera.getCameraInfo()));

        } catch (ExecutionException e) {
            e.printStackTrace();
            Log.e("TAG", "Use case binding failed", …
Run Code Online (Sandbox Code Playgroud)

java android android-camera kotlin android-camerax

4
推荐指数
1
解决办法
1815
查看次数

将本机代码与 CameraX 集成到自定义 React Native 组件失败

您好,我有一个应用程序,它使用 Android 中现已弃用的相机模块来显示相机视图并使用 mlkit 面部检测在其上绘制滤镜。最近我们决定将其升级到 CameraX,我完成了所有必要的步骤,使其作为一个单独的 Android 应用程序工作,并且它可以工作。当我想将它合并到我们现有的 Custom React Native 模块中时,无论我做什么,它都不会在屏幕上显示任何内容。我检查了视图尺寸,它们似乎没问题。下面是我用来启动相机模块的代码。

package com.myProject.speech.components

import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.Canvas
import android.hardware.camera2.CameraManager
import android.os.Bundle
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.*
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.size
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStoreOwner
import com.facebook.react.uimanager.ThemedReactContext
import com.google.mlkit.common.MlKitException
import com.google.mlkit.vision.face.FaceDetectorOptions
import com.myProject.grpc.speech.StickerDatabase
import com.myProject.speech.R
import com.myProject.speech.utils.PreferenceUtils
import java.util.*
import androidx.databinding.DataBindingUtil
import com.myProject.camera_test.mlkit.facedetection.FaceContourDetectionProcessor …
Run Code Online (Sandbox Code Playgroud)

android kotlin react-native android-camerax

4
推荐指数
1
解决办法
850
查看次数

如何从 Android MediaImage 以 OUTPUT_IMAGE_FORMAT_RGBA_8888 格式创建位图?

我正在尝试使用 CameraX 图像分析(版本 1.1.0-alpha08)的这个新功能:使用 setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888),发送到分析仪的图像将具有 RGBA 格式。

请参阅此参考:https://developer.android.com/reference/androidx/camera/core/ImageAnalysis#OUTPUT_IMAGE_FORMAT_RGBA_8888

我需要将发送到分析器的图像转换为位图,以便我可以将其输入到 TensorFlow 分类器。如果没有这个新功能,我将收到标准 YUV_420_888 格式的图像,然后我将不得不使用可以在 google 上搜索到的几种解决方案之一,以便将 YUV_420_888 转换为 RGBA,然后转换为位图。像这样: https: //blog.minhazav.dev/how-to-convert-yuv-420-sp-android.media.Image-to-Bitmap-or-jpeg/。我认为直接以​​ RGBA 格式获取媒体图像应该可以帮助我避免实现那些痛苦的解决方案(我实际上已经尝试过,但到目前为止似乎对我来说效果不太好)。

问题是我不知道如何将此 RGBA 媒体图像转换为位图。我注意到调用 mediaImage.getFormat() 返回 1 ,它不是 ImageFormat 值,而是 PixelFormat 值,逻辑上对应于 RGBA_8888 格式,这与文档一致:“所有 ImageProxy 发送到 ImageAnalysis.Analyzer.analyze( ImageProxy) 的格式为 PixelFormat.RGBA_8888"。

我已经尝试过这个:

private Bitmap toBitmapRGBA(Image image) {
    Image.Plane[] planes = image.getPlanes();
    ByteBuffer buffer = planes[0].getBuffer();
    buffer.rewind();
    int size = buffer.remaining();
    byte[] bytes = new byte[size];
    buffer.get(bytes);
    Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);
    return bitmapImage;
}
Run Code Online (Sandbox Code Playgroud)

这将返回 null …

java buffer bitmap rgba android-camerax

4
推荐指数
1
解决办法
1832
查看次数

Android CameraX NoSuchMethodError:没有静态方法 getOrCreateInstance(Landroid/content/Context;)

我运行 Android 模拟器并在“cameraProviderFuture = ProcessCameraProvider.getInstance(requireActivity())”这一行崩溃。为什么?

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val barcodeScannerOptions = BarcodeScannerOptions.Builder()
            .setBarcodeFormats(
                Barcode.FORMAT_QR_CODE
            )
            .build()


        cameraProviderFuture = ProcessCameraProvider.getInstance(requireActivity())
        cameraProviderFuture.addListener(
            Runnable {
                val cameraProvider = cameraProviderFuture.get()
                val preview = Preview.Builder().build()
                val cameraSelector = CameraSelector.Builder()
                    .requireLensFacing(LENS_FACING_BACK)
                    .build()
                preview.setSurfaceProvider(binding.cargoPreviewView.surfaceProvider)
                val camera =
                    cameraProvider.bindToLifecycle(viewLifecycleOwner, cameraSelector, preview)

            },ContextCompat.getMainExecutor(requireContext())
        )


    }
Run Code Online (Sandbox Code Playgroud)

logcat错误:java.lang.NoSuchMethodError:没有静态方法 getOrCreateInstance(Landroid/content/Context;)Lcom/google/common/util/concurrent/ListenableFuture; 在类 Landroidx/camera/core/CameraX 中;或其超类(“androidx.camera.core.CameraX”的声明出现在 /data/app/~~pfIVQ_AeL7AM1I9N0OVqPw==/-soiV3Uc-nIKoyBDTJx6EHA==/base.apk 中)在 androidx.camera.lifecycle.ProcessCameraProvider.getInstance (ProcessCameraProvider.java:149) 在 com.hannlync.mercury.fragment.information_activity.information_fragment.cargo_fragment.CargoFragment.onViewCreated(CargoFragment.kt:47)

kotlin android-studio android-camerax

4
推荐指数
1
解决办法
3163
查看次数

什么是Android CameraX?

什么是Android CameraX?

Google I / O 2019中计划召开有关CameraX的会议。这是什么?它是新的框架API吗?是新图书馆吗? https://events.google.com/io/schedule/events/8d400240-f31f-4ac2-bfab-f8347ef3ab3e

这是否意味着不推荐使用Camera2 API? https://github.com/googlesamples/android-Camera2Basic

android android-jetpack android-camerax

3
推荐指数
2
解决办法
2530
查看次数

CameraX - Unable to get camera ID for use case androidx.camera.core.Preview-4817149b-004d-42b8-a103-ea998038268b - java.lang.IllegalArgumentException

While implementing the code from Google CodeLabs I am getting this crash report while starting the CameraActivity - CameraX - Google Code Labs

Logs: Process: in.novopay.novoloan, PID: 5845 java.lang.IllegalArgumentException: Unable to get camera ID for use case androidx.camera.core.Preview-4817149b-004d-42b8-a103-ea998038268b at androidx.camera.camera2.impl.Camera2DeviceSurfaceManager.getCameraIdFromConfig(Camera2DeviceSurfaceManager.java:310) at androidx.camera.camera2.impl.Camera2DeviceSurfaceManager.requiresCorrectedAspectRatio(Camera2DeviceSurfaceManager.java:268) at androidx.camera.core.Preview.updateUseCaseConfig(Preview.java:387) at androidx.camera.core.UseCase.(UseCase.java:92) at androidx.camera.core.Preview.(Preview.java:99) at in.novopay.uicontrollibrary.activities.CameraActivity.startCamera(CameraActivity.kt:94) at in.novopay.uicontrollibrary.activities.CameraActivity.access$startCamera(CameraActivity.kt:30) at in.novopay.uicontrollibrary.activities.CameraActivity$checkPermission$1.run(CameraActivity.kt:45) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:7000) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) Caused by: java.lang.IllegalArgumentException: Option does not exist: Option{id=camerax.core.camera.lensFacing, valueClass=class androidx.camera.core.CameraX$LensFacing, token=null} …

android-jetpack androidx android-camerax

3
推荐指数
1
解决办法
514
查看次数

不能使用camerax拍摄多张图片

我正在尝试使用 camerax 拍摄多张照片,但只拍摄了第一张照片,代码和日志输出将显示我的意思。

这是代码:

        Log.d(TAG, "------------------ taking new picture1");
        mImageCapture.takePicture(new ImageCapture.OnImageCapturedListener() {
            @Override
            public void onCaptureSuccess(ImageProxy imageProxy, int rotationDegrees) {
                Image image = imageProxy.getImage();
                Log.d(TAG, "taking new picture onCapture Success 1 called");
            }

            @Override
            public void onError(ImageCapture.UseCaseError useCaseError, String message, @Nullable Throwable cause) {
                super.onError(useCaseError, message, cause);
                Log.d(TAG, "--------- error in image capture 1" + message);


            }
        });

        Log.d(TAG, "------------------ taking new picture 2");
        mImageCapture.takePicture(new ImageCapture.OnImageCapturedListener() {
            @Override
            public void onCaptureSuccess(ImageProxy imageProxy, int rotationDegrees) {
                Image image = imageProxy.getImage();
                Log.d(TAG, …
Run Code Online (Sandbox Code Playgroud)

android-camerax

3
推荐指数
1
解决办法
956
查看次数

将 CameraX + CameraView 绑定到生命周期的问题

我正在尝试在干净的 android 应用程序中包含一个 CameraView 组件(来自 CameraX jetpack),如下所示:

https://medium.com/@hitherejoe/exploring-camerax-on-android-camera-view-daae6dfaa4ec https://developer.android.google.cn/jetpack/androidx/releases/camera

CameraView 非常简单,但将其绑定到 Activity 生命周期时出现问题。活动已授予相机权限。我试过在没有 CameraView 的情况下使用 CameraX(使用 SurfaceView + 所有设置),但以相同的结果和异常结束(并且 CameraView 使用起来要简单得多)。在三星 S10 和红米 Note 7 上测试过。 似乎组件尺寸/测量有问题:

例外

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 androidx.camera.view.CameraXModule.bindToLifecycleAfterViewMeasured(CameraXModule.java:268)
        at androidx.camera.view.CameraView.onMeasure(CameraView.java:364)
        at android.view.View.measure(View.java:24973)
        at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
        at android.view.View.measure(View.java:24973)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:24973)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:403)
        at android.view.View.measure(View.java:24973)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-camera2 androidx android-camerax

3
推荐指数
1
解决办法
1285
查看次数

如何在 CameraX 预览上设置一个框,以便在 Java 中使用 ImageAnalysis 进行处理?

我一直在开发一个应用程序,它需要将 CameraX 用于它的预览流,但它也需要一种用于解码文本的框式叠加层。我已经成功地实现了预览,但似乎无法找到一种方法来实现一个覆盖,在不使用任何第三方应用程序的情况下,文本将被解码。现在我们可以从整个屏幕解码文本。我在 Codelabs 教程(链接)中看到了一个代码,它就是这样做的,但它在 Kotlin 中,我无法破译这个复杂的 Kotlin 代码。如果有人可以在不使用第三方库的情况下帮助我做到这一点,那就太好了。提前致谢。

我的 XML 代码:

<androidx.camera.view.PreviewView
android:id="@+id/previewView"
android:layout_width="match_parent"
android:layout_height="675dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar">
Run Code Online (Sandbox Code Playgroud)

我的相机逻辑:

PreviewView mCameraView;
Camera camera;
void startCamera() {
  mCameraView = findViewById(R.id.previewView);

  cameraProviderFuture = ProcessCameraProvider.getInstance(this);

  cameraProviderFuture.addListener(() -> {
      try {
          ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
          bindPreview(cameraProvider);
      } catch (ExecutionException | InterruptedException e) {
          // No errors need to be handled for this Future.
          // This should never be reached.
      }
  }, ContextCompat.getMainExecutor(this));
}



void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {


  Preview preview = new …
Run Code Online (Sandbox Code Playgroud)

java android kotlin firebase-mlkit android-camerax

3
推荐指数
1
解决办法
3358
查看次数