java如何在相机预览帧上进行图像分析?
我正在尝试建立一个二维码扫描仪&;一个很好的功能是相机预览,但现在我还想拍摄那些相同的图像帧进行处理。我发现最好的方法就是使用ImageAnalysis类。下面是我的实现,不幸的是,我不知道这是否是正确的实现,因为它不起作用。此外,我不确定是否正确传递了“Executor”参数。有人能帮我们吗?谢谢
public class MainActivity extends AppCompatActivity {
PreviewView previewView_main;
ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
CameraSelector cameraSelector;
Preview preview;
ProcessCameraProvider cameraProvider;
private final int CAMERA_REQUEST_CODE = 101;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
previewView_main = findViewById(R.id.previewView_main);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
preview = new Preview.Builder().build();
try {
cameraProvider = cameraProviderFuture.get();
} catch (ExecutionException | InterruptedException e) {
// This should never be reached.
}
ask_permissions();
}
//=============================================================================
private void load_camera_preview() {
cameraProviderFuture.addListener(() -> {
bindPreview(cameraProvider);
}, ContextCompat.getMainExecutor(this));
draw_preview_rectangle();
}
private void bindPreview(ProcessCameraProvider cameraProvider) {
preview.setSurfaceProvider(previewView_main.getSurfaceProvider());
// ImageAnalysis for processing camera preview frames
ImageAnalysis imageAnalysis =
new ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
Executor executor = new Executor() {
@Override
public void execute(Runnable command) {
}
};
imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {
@Override
public void analyze(@NonNull ImageProxy image) {
Log.d("TAG", "IMAGE : " + image.getImageInfo().getRotationDegrees());
}
});
cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis,preview);
}
private void ask_permissions() {
// asks camera permission to the user.
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
String[] permissions = {Manifest.permission.CAMERA};
ActivityCompat.requestPermissions(this, permissions, CAMERA_REQUEST_CODE);
}
// if permission already granted then load camera preview
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
load_camera_preview();
}
}
// Called when a request permission is denied or accepted.
// Load camera preview in both cases
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
load_camera_preview();
} else {
load_camera_preview();
}
}
//=============================================================================
public class Box extends View {
private Paint paint = new Paint();
Box(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) { // Override the onDraw() Method
super.onDraw(canvas);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.GREEN);
paint.setStrokeWidth(4);
//center
int x0 = getWidth() / 2;
int y0 = getHeight() / 2;
int dx = getHeight() / 6;
int dy = getHeight() / 8;
//draw guide box
canvas.drawRect(x0 - dx, y0 - dy, x0 + dx, y0 + dy, paint);
}
}
private void draw_preview_rectangle() {
Box box = new Box(this);
addContentView(box, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}
}
主要活动。xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:app="http://schemas.安卓.com/apk/res-auto"
xmlns:tools="http://schemas.安卓.com/tools"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
tools:context=".MainActivity">
<安卓x.camera.view.PreviewView
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
安卓:id="@+id/previewView_main">
</安卓x.camera.view.PreviewView>
</FrameLayout>
共 (0) 个答案