You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Java:如何在ImageView上绘制多个Firebase ML Kit检测点

解决ImageView上绘制多个概率点的问题

看起来你遇到的核心问题是每次调用drawpoint都会重新加载原始图片并创建新的Bitmap,导致之前绘制的点被完全覆盖,而且你在循环里还没有实际使用listpoint里的点,反而硬编码了固定坐标。我来帮你一步步修正:

1. 修复概率点数组遍历的越界问题

你当前的循环逻辑里i = i+1可能会导致数组越界(比如probabilities长度为奇数时),应该改成按步长2遍历:

ArrayList<Point> listpoint = new ArrayList<Point>();
// 按x、y成对遍历,确保不会越界
for (int i = 0; i < probabilities.length - 1; i += 2) {
    float x = probabilities[i];
    float y = probabilities[i+1];
    Point p = new Point(x, y);
    Log.i("Information1 ","valeur 1 "+p.getX());
    listpoint.add(p);
    Log.i("Information2 ","valeur 2 "+p.getX());
}

2. 重构drawpoint逻辑,避免重复创建Bitmap

现在你的drawpoint每次都会重新加载原始图片,这会覆盖之前所有绘制的点。应该先一次性创建可编辑的Bitmap和Canvas,然后把所有点都画在同一个画布上,最后再设置到ImageView:

// 重构后的绘制方法:一次性加载图片,批量绘制所有点
private void drawPoints(ImageView imageView, List<Point> points, int radius) {
    // 只加载一次原始图片
    BitmapFactory.Options myOptions = new BitmapFactory.Options();
    myOptions.inDither = true;
    myOptions.inScaled = false;
    myOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
    myOptions.inPurgeable = true;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.imgg, myOptions);
    
    // 创建可编辑的Bitmap
    Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(mutableBitmap);
    
    // 设置画笔
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.WHITE);
    
    // 遍历所有点,一次性画在画布上
    for (Point p : points) {
        // 这里根据你的需求调整缩放比例,比如乘以100
        float x = p.getX() * 100;
        float y = p.getY() * 100;
        canvas.drawCircle(x, y, radius, paint);
    }
    
    // 最后把绘制好的Bitmap设置到ImageView
    imageView.setAdjustViewBounds(true);
    imageView.setImageBitmap(mutableBitmap);
}

3. 修正useInferenceResult里的调用逻辑

现在你可以在useInferenceResult里直接调用新的drawPoints方法,传入你的点列表,而不是循环调用旧的drawpoint:

private void useInferenceResult(float[] probabilities) throws IOException { 
    ArrayList<Point> listpoint = new ArrayList<Point>();
    // 修正后的遍历逻辑
    for (int i = 0; i < probabilities.length - 1; i += 2) {
        float x = probabilities[i];
        float y = probabilities[i+1];
        Point p = new Point(x, y);
        listpoint.add(p);
        Log.e("Resultat","point_"+i/2+"("+p.getX()+", "+p.getY()+")");
    }
    
    // 一次性绘制所有点
    ImageView imageView = findViewById(R.id.imageView);
    drawPoints(imageView, listpoint, 1);
}

为什么之前只显示单个点?

  • 旧的drawpoint方法每次都会重新加载原始图片,创建新的Bitmap,所以每次调用都会覆盖之前的绘制结果,最后只保留最后一次画的点。
  • 你在循环里还硬编码了两个固定坐标的drawpoint调用,完全没有使用listpoint里的点,等于白收集了模型输出的概率点。

这样修改后,所有的点都会被画在同一个Bitmap上,最后一次性显示在ImageView里,就能看到多个点了。

内容的提问来源于stack exchange,提问作者abdou_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:38:02