zzrb.zza导致每隔一个camera X分析器都会出现一个除以零的算术异常.分析帧



所以我又开始了一个几个月没接触过的项目。几天前,我一直在处理它,没有任何问题(至少在我之前的最新帖子之后(。不管今天出于什么原因,我都去跑步了,我已经为这个问题争论了几个小时了。。。

问题:

我正在创建一个FIrebaseVisionImage对象,用于各种ml视觉任务。

FirebaseVisionImage image = FirebaseVisionImage.fromMediaImage(mediaImage, rotation);

在此之前相当标准的设置(类似于他们在使用CameraX和ImageAnalysis.Analyzer的示例中所做的设置。无论出于什么原因,我现在都会遇到以前没有遇到的错误。

java.lang.ArithmeticException: divide by zero
at com.google.android.gms.internal.firebase_ml.zzrb.zza(com.google.firebase:firebase-ml-vision@@24.0.0:55)
at com.google.android.gms.internal.firebase_ml.zzrb.zza(com.google.firebase:firebase-ml-vision@@24.0.0:48)
at com.google.firebase.ml.vision.common.FirebaseVisionImage.fromMediaImage(com.google.firebase:firebase-ml-vision@@24.0.0:20)
at com.divertinc.visiondispositiontesting.MainActivity$4.analyze(MainActivity.java:248)

到目前为止我所做的:

好吧,没问题,让我把它叠加起来。我看到这行:

int var9 = var2 / var8;

是问题所在。好吧,很酷,让我们来计算一下这些值。

让我们倒过来工作:

  1. 当我从MediaImage FirebaseVisionImage调用时,它应该返回这个(基于我的图像(:

    return new FirebaseVisionImage(zzrb.zza(var2, var0.getWidth(), var0.getHeight()), (new Builder()).setFormat(17).setWidth(var0.getWidth()).setHeight(var0.getHeight()).setRotation(var1).build())
    
  2. K很酷,所以我们知道这里有问题的方法是:zza(Plane[]var0,int var1,int var2(

  3. 那么下面的行(就误差而言(是:zza(var0[0],var1,var2,var4,0,1(
  4. 然后调用:zza(Plane var0,int var1,int var2,byte[]var3,int var4,int var5(
  5. 它最终调用:int var9=var2/var8

现在,我是安卓工作室的新手,所以在跟踪时我不知道如何在类文件中获取值,所以我回到了创建FirebaseVisionImage的地方,就在那之前,我做了这个:

Image.Plane var0 = mediaImage.getPlanes()[0];
ByteBuffer var6 = var0.getBuffer();
int var2 = mediaImage.getHeight();
int var8 = (var6.remaining() + var0.getRowStride() - 1) / var0.getRowStride();
Log.d("divide debug: ", String.valueOf(var2));
Log.d("divide debug: ", String.valueOf(var8));
Log.d("divide debug: ", String.valueOf(var6.remaining()));
Log.d("divide debug: ", String.valueOf(var0.getRowStride()));
Log.d("divide debug: ", String.valueOf((var6.remaining() + var0.getRowStride() - 1)));

这导致:

480

0

0

640

639

K井639/640为0.9。。。。现在,如果我还记得Java是如何工作的,那么int除法四舍五入——除非我假设被显式重写?无论如何K我想那完全有道理。好吧,如果我没记错的话,从现在到它工作的时候,我唯一改变的是依赖性升级,我实际上降级了,看看这是否会影响它,在看了发布说明后,它无论如何都不应该影响它。

编辑:所以我发现,实际上,当我记录我之前所做的事情时,我注意到之前有4帧被分析,结果如下:

日志1:

480

480

307200

640

307839

日志2:

480

0

0

640

639

日志3:

480

480

307200

640

307839

崩溃消息

日志4:

480

0

0

640

639

我被困的地方:(

错误发生在第三个日志之后不到100毫秒,而在那之后的近300毫秒,第四个日志被命中。

因此,我的假设是,每隔一帧缓冲一次是有问题的,因为.remining((方法会导致每隔一帧为0,这是不应该发生的。不幸的是,我对此知之甚少,所以我想看看是否有人能为我指明正确的方向D:从好的方面来说,在发布这篇文章的整个过程中,我学到了很多(我已经在这篇文章上工作了大约45分钟(

以下是我的整个相机功能,我认为它有很多问题,就像D:一样

private void startCamera() {
//make sure there isn't another camera instance running before starting
CameraX.unbindAll();
/* start preview */
int aspRatioW = txView.getWidth(); //get width of screen
int aspRatioH = txView.getHeight(); //get height
Rational asp = new Rational (aspRatioW, aspRatioH); //aspect ratio
Size screen = new Size(aspRatioW, aspRatioH); //size of the screen
//config obj for preview/viewfinder thingy.
PreviewConfig pConfig = new PreviewConfig.Builder().setTargetResolution(screen).build();
Preview preview = new Preview(pConfig); //lets build it
preview.setOnPreviewOutputUpdateListener(
new Preview.OnPreviewOutputUpdateListener() {
//to update the surface texture we have to destroy it first, then re-add it
@Override
public void onUpdated(Preview.PreviewOutput output){
ViewGroup parent = (ViewGroup) txView.getParent();
parent.removeView(txView);
parent.addView(txView, 0);
txView.setSurfaceTexture(output.getSurfaceTexture());
updateTransform();
}
});
/* image capture */
.setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).build();
final ImageCapture imgCap = new ImageCapture(imgCapConfig);
findViewById(R.id.imgCapture).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("image taken", "image taken");
}
});
/* image analyser */
ImageAnalysisConfig imgAConfig = new ImageAnalysisConfig.Builder().setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE).build();
ImageAnalysis analysis = new ImageAnalysis(imgAConfig);
analysis.setAnalyzer(
Executors.newSingleThreadExecutor(), new ImageAnalysis.Analyzer(){
@Override
public void analyze(ImageProxy imageProxy, int degrees){
while (weCanAnalyzeFrame) {
if (!isMachineLearning) {
Log.d("analyze", "just analyzing");
if (imageProxy == null || imageProxy.getImage() == null) {
Log.d("imageProxy: ", "is null");
return;
}
Image mediaImage = imageProxy.getImage();
int rotation = degreesToFirebaseRotation(degrees);
Log.d("degrees: ", String.valueOf(degrees));
Log.d("rotation: ", String.valueOf(rotation));
Image.Plane var0 = mediaImage.getPlanes()[0];
ByteBuffer var6 = var0.getBuffer();
int var2 = mediaImage.getHeight();
int var8 = (var6.remaining() + var0.getRowStride() - 1) / var0.getRowStride();
//                            int var9 = var2 / var8;
Log.d("divide debug: ", String.valueOf(var2));
Log.d("divide debug: ", String.valueOf(var8));
Log.d("divide debug: ", String.valueOf(var6.remaining()));
Log.d("divide debug: ", String.valueOf(var0.getRowStride()));
Log.d("divide debug: ", String.valueOf((var6.remaining() + var0.getRowStride() - 1)));
Log.d("divide debug: ", " ");
FirebaseVisionImage image = FirebaseVisionImage.fromMediaImage(mediaImage, rotation);
Log.d("analyze", "isMachineLearning is about to be true");
isMachineLearning = true;
extractBarcode(image, image.getBitmap());
}
}
}
});
//bind to lifecycle:
CameraX.bindToLifecycle(this, analysis, imgCap, preview);
}

看起来像var6.remaining((:yPlane缓冲区的当前位置((到limit((距离崩溃的mediaImage为0。

mediaImage来自MLKit控制的摄像机。但是,mlkit在执行除法操作之前应该检查该值,以避免崩溃。我们会修复它。

刚刚从camera X团队得到确认,这是一个在camera X核心测试版02中引入的错误,修复将在测试版04中进行。

目前,在为MLKit创建InputImage之前,您可以在缓冲区上调用rewind((作为解决方法。

谢谢!

相关内容

最新更新