[英]How to analyze that what i see in PreviewView (Camerax)?
我是新來的,所以首先我想說“大家早上好”; ;)
現在我想描述我的問題。 我使用CameraX
、 PreviewView
和ImageAnalyzer
。 我的PreviewView
不在整個屏幕上,而是在單獨的 window 中。 看圖片
我只想分析我在預覽視圖中看到的內容,但即使我在PreviewView
不到,Analyzer 也會讀取條形碼。 是否可以獲得我在PreviewView
中看到的條形碼,換句話說,只分析PreviewView
而不是整個屏幕? 先感謝您。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 3);
mPreviewView = findViewById(R.id.viewFinder);
detector = FirebaseVision.getInstance()
.getVisionBarcodeDetector();
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));
}
@SuppressLint("RestrictedApi")
private void bindPreview(ProcessCameraProvider cameraProvider) {
Preview preview = new Preview.Builder()
// .setTargetResolution(new Size(1920, 1680))
.setTargetAspectRatio(AspectRatio.RATIO_16_9)
.build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.DEFAULT_BACK_CAMERA.getLensFacing())
.build();
ImageAnalysis imageAnalysis =
new ImageAnalysis.Builder()
.setMaxResolution(new Size(150, 200))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), new ImageAnalysis.Analyzer() {
@Override
public void analyze(@NonNull ImageProxy image) {
int rotationDegrees = image.getImageInfo().getRotationDegrees();
int rotation = degreesToFirebaseRotation(rotationDegrees);
@SuppressLint("UnsafeExperimentalUsageError") Image getImage = image.getImage();
// Log.i("Format", getImage.getCropRect()+"");
FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromMediaImage(getImage, rotation);
detector.detectInImage(firebaseVisionImage)
.addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>() {
@Override
public void onSuccess(List<FirebaseVisionBarcode> barcodes) {
if (!barcodes.isEmpty()) {
Rect bounds = barcodes.get(0).getBoundingBox();
Paint myPaint = new Paint();
Canvas can = new Canvas();
myPaint.setColor(Color.rgb(255, 0, 0));
myPaint.setStrokeWidth(200);
can.drawRect(bounds, myPaint);
Log.i("Result", bounds+ "");
//imageAnalysis.clear();
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
image.close();
}
});
mPreviewView.setPreferredImplementationMode(PreviewView.ImplementationMode.SURFACE_VIEW);
mPreviewView.setScaleType(PreviewView.ScaleType.FIT_CENTER);
preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview);
}
private int degreesToFirebaseRotation(int degrees) {
switch (degrees) {
case 0:
return FirebaseVisionImageMetadata.ROTATION_0;
case 90:
return FirebaseVisionImageMetadata.ROTATION_90;
case 180:
return FirebaseVisionImageMetadata.ROTATION_180;
case 270:
return FirebaseVisionImageMetadata.ROTATION_270;
default:
throw new IllegalArgumentException(
"Rotation must be 0, 90, 180, or 270.");
}
}
}
請查看LifecycleCameraController API。 如果 CameraController 與 PreviewView 一起使用,ImageProxy 的裁剪矩形將匹配最終用戶在 PreviewView 中看到的內容。 代碼示例:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.