CameraX获取摄像头YUV数据

  1. 添加依赖
    1. def camerax_version = "1.0.0-beta07"
      implementation "androidx.camera:camera-camera2:$camerax_version"
      implementation "androidx.camera:camera-lifecycle:$camerax_version"
      implementation "androidx.camera:camera-view:1.0.0-alpha14"

  2. 声明权限
    1. <uses-feature android:name="android.hardware.camera.any" />
      <uses-permission android:name="android.permission.CAMERA" />

  3. 预览布局
    1. <?xml version="1.0" encoding="utf-8"?>
      <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">
      
          <androidx.camera.view.PreviewView
              android:id="@+id/previewView"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
      
      </FrameLayout>

  4. 代码部署
    1. package com.melon.camerademo;
      
      import android.Manifest;
      import android.content.pm.PackageManager;
      import android.os.Bundle;
      import android.util.Log;
      import android.widget.Toast;
      
      import androidx.annotation.NonNull;
      import androidx.annotation.Nullable;
      import androidx.appcompat.app.AppCompatActivity;
      import androidx.camera.core.CameraSelector;
      import androidx.camera.core.ImageAnalysis;
      import androidx.camera.core.ImageCapture;
      import androidx.camera.core.ImageProxy;
      import androidx.camera.core.Preview;
      import androidx.camera.lifecycle.ProcessCameraProvider;
      import androidx.camera.view.PreviewView;
      import androidx.core.app.ActivityCompat;
      import androidx.core.content.ContextCompat;
      
      import com.google.common.util.concurrent.ListenableFuture;
      
      import java.nio.ByteBuffer;
      import java.util.concurrent.ExecutorService;
      import java.util.concurrent.Executors;
      
      public class MyActivity extends AppCompatActivity {
      
          private static final String TAG = "MyActivity";
          private static final int CAMERA_REQUEST_CODE = 100;
          private static final CameraSelector MY_CAMERA = CameraSelector.DEFAULT_BACK_CAMERA;
          private PreviewView mPreviewView;
          private ImageCapture mImageCapture;
          ExecutorService mCameraExecutor = Executors.newSingleThreadExecutor();
      
          @Override
          protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              initView();
              //启动摄像头
              startCamera();
          }
      
          private void initView() {
              mPreviewView = findViewById(R.id.previewView);
          }
      
          private void startCamera() {
              if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                  Toast.makeText(this, "没有摄像头权限", Toast.LENGTH_LONG).show();
                  Log.e(TAG, "没有摄像头权限");
                  //权限申请
                  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
                  return;
              }
              Log.d(TAG, "有了摄像头权限");
      
              ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
              cameraProviderFuture.addListener(new Runnable() {
                  @Override
                  public void run() {
                      try {
                          ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                          Preview preview = new Preview.Builder().build();
                          preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
                          mImageCapture = new ImageCapture.Builder().build();
      
                          //图像分析
                          ImageAnalysis imageAnalyzer = new ImageAnalysis.Builder().build();
                          imageAnalyzer.setAnalyzer(mCameraExecutor, new ImageAnalysis.Analyzer() {
                              @Override
                              public void analyze(@NonNull ImageProxy image) {
                                  // 分析
                                  ByteBuffer byteBuffer = image.getPlanes()[0].getBuffer();
                                  int pixelStride = image.getPlanes()[0].getPixelStride();
                                  int rowStride = image.getPlanes()[0].getRowStride();
                                  ByteBuffer byteBuffer1 = image.getPlanes()[1].getBuffer();
                                  int pixelStride1 = image.getPlanes()[1].getPixelStride();
                                  int rowStride1 = image.getPlanes()[1].getRowStride();
                                  ByteBuffer byteBuffer2 = image.getPlanes()[2].getBuffer();
                                  int pixelStride2 = image.getPlanes()[2].getPixelStride();
                                  int rowStride2 = image.getPlanes()[2].getRowStride();
                                  int rotationDegrees = image.getImageInfo().getRotationDegrees();
                                  int format = image.getFormat(); //CameraX默认出图格式:YUV_420_888  YYYY UV VU,数据分别在image.getPlanes()[0],image.getPlanes()[1],image.getPlanes()[2]中
                                  int width = image.getWidth();
                                  int height = image.getHeight();
                                  Log.d(TAG, "capacity: " + byteBuffer.capacity()
                                          + ", pixelStride: " + pixelStride
                                          + ", rowStride: " + rowStride
                                          + ", capacity1: " + byteBuffer1.capacity()
                                          + ", pixelStride1: " + pixelStride1
                                          + ", rowStride1: " + rowStride1
                                          + ", capacity2: " + byteBuffer2.capacity()
                                          + ", pixelStride2: " + pixelStride2
                                          + ", rowStride2: " + rowStride2
                                          + ", rotationDegrees: " + rotationDegrees
                                          + ", format: " + format
                                          + ", width: " + width
                                          + ", height: " + height
                                  );
      
                                  image.close();
                              }
                          });
      
                          cameraProvider.unbindAll();
                          cameraProvider.bindToLifecycle(MyActivity.this, MY_CAMERA, preview, mImageCapture, imageAnalyzer);
                      } catch (Exception e) {
                          Log.e(TAG, "error: " + e.getMessage());
                      }
                  }
              }, ContextCompat.getMainExecutor(this));
          }
      
      }
      

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值