有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从addOnSuccessListener获取结果

我希望在安卓上实现一个简单的物体检测应用程序,使用一个我已经训练过的自定义模型,我将遵循这个custom model ML Kit tutorial作为指导

根据安卓studios中的命令提示符,它已经成功地生成了边界框等等,但是我不知道如何访问addOnSuccessListener中的数据

objectDetector.process(image).addOnFailureListener(e -> { errorMessage.set(e.getMessage()); }).addOnSuccessListener(results -> { for (DetectedObject detectedObject : results) { Rect boundingBox = detectedObject.getBoundingBox(); Integer trackingId = detectedObject.getTrackingId(); for (DetectedObject.Label label : detectedObject.getLabels()) { String text = label.getText(); int index = label.getIndex(); float confidence = label.getConfidence(); } } });

有什么好的在线教程可以帮助我解决这个问题吗?或者我可以研究类似的示例代码

提前谢谢你


共 (2) 个答案

  1. # 1 楼答案

    将所需值存储在全局变量中,您可以从任何地方访问这些变量:

    例如,在你的活动中:

    Rect boundingBox;
    Integer trackingId;
    ...
    

    然后在结果回调的内部:

    results -> {
        for (DetectedObject detectedObject : results) {
            boundingBox = detectedObject.getBoundingBox();
            trackingId = detectedObject.getTrackingId();
            ...
        }
    }
    

    现在,您可以在任何地方使用这些值。如果你认为变量从来没有初始化过,因为你一开始就没有得到结果,那么一定要检查是否为空

    此外,您可能有多个对象,因此可以创建一个对象列表来保存所有引用:

    ArrayList<Rect> boundingBoxes;
    ...
    

    然后:

    for (DetectedObject detectedObject : results) {
        boundingBoxes.add(detectedObject.getBoundingBox());              
    }
    

    现在所有返回的框都在上面的列表中,您可以遍历它并相应地使用它

    更有效的是,您可以在列表中收集所有返回的对象,并且只在需要时解析参数

    ArrayList<DetectedObject> detectedObjects;
    
  2. # 2 楼答案

    您发布的示例代码已经为直接访问OnSuccessListener中的数据提供了一个示例。如果要绘制边界框或打印检测到的对象数量。。,我们可以在那里做
    然而,如果你想以后存储和访问这些数据,你可以像尼科斯提到的那样存储