如何解决ImageAnalyzer ML Kit 边界框错误排列
<RelativeLayout
android:id="@+id/myP"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<androidx.camera.view.PreviewView
android:id="@+id/mPreviewView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.example.dochjavatestimplementation.pkgActivity.ExtendedImageView
android:id="@+id/imageViewOmgShowIt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible" />
</RelativeLayout>
previewView 用于显示相机,ExtendedImageView 用于显示显示找到的对象rect。
我的图像分析器:
imageAnalysis = new ImageAnalysis.Builder()
.setTargetResolution(new Size(mPreviewView.getWidth(),mPreviewView.getHeight()))
.build();
imageAnalysis.setAnalyzer(executor,new PaperImageAnalyser());
PaperImageAnalyser:
public class PaperImageAnalyser implements ImageAnalysis.Analyzer {
ObjectDetectorOptions options = new ObjectDetectorOptions.Builder()
.setDetectorMode(ObjectDetectorOptions.STREAM_MODE)
.enableClassification() // Optional
.build();
ObjectDetector objectDetector = ObjectDetection.getClient(options);
@Override
public void analyze(@NonNull ImageProxy imageProxy) {
@SuppressLint("UnsafeExperimentalUsageError") Image mediaimage = imageProxy.getimage();
if (mediaimage != null) {
Inputimage image =Inputimage.fromMediaimage(mediaimage,imageProxy.getimageInfo().getRotationdegrees());
objectDetector.process(image)
.addOnSuccessListener(
new OnSuccessListener<List<Detectedobject>>() {
@Override
public void onSuccess(List<Detectedobject> detectedobjects) {
for (Detectedobject detectedobject : detectedobjects) {
Rect boundingBox = detectedobject.getBoundingBox();
Cameraimp.imageViewOmgShowIt.drawFoundobj(boundingBox);
}
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e("error",""+e.getMessage());
}
})
.addOnCompleteListener(new OnCompleteListener<List<Detectedobject>>() {
@SuppressLint("UnsafeExperimentalUsageError")
@Override
public void onComplete(@NonNull Task<List<Detectedobject>> task) {
imageProxy.getimage().close();
imageProxy.close();
}
});
}
}
}
绘制矩形:
public void drawFoundobj(Rect boundingBox) {
foundYo = boundingBox;
invalidate(); //call draw
}
和
Paint mPaint = new Paint();
Canvas mCanvas = new Canvas();
@Override
protected void onDraw(Canvas canvas) {
//clear exsisting rects
Xfermode x = mPaint.getXfermode();
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mPaint.setXfermode(x);
mCanvas.drawPaint(mPaint);
//set current rect
Paint paint = new Paint();
paint.setColor(Color.YELLOW);
paint.setstrokeWidth(3);
paint.setAlpha(40);
canvas.drawRect(foundYo,paint);
}
结果如下:
正如你所看到的,问题是虽然物体以某种方式被识别,但与物体的位置相比,坐标是错误的。
可能是什么原因?
我从 imageanalyzer 接收到的图像的分辨率是否较小,从而导致坐标较小从而错误?
还是我画错了?
解决方法
您需要获取分析图像的宽度和高度,并将边界框转换为合适的显示尺寸。请参考 mlkit vision_quickstart 中的这个示例作为参考。 https://github.com/googlesamples/mlkit/blob/74d5edb101d1e2fb8bd404c41a684b71a06d507a/android/vision-quickstart/app/src/main/java/com/google/mlkit/vision/demo/java/CameraXLivePreviewActivity.java#L421
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。