0

我希望使用我已经训练过的自定义模型在 android 上实现一个简单的对象检测应用程序,并且我正在按照这个自定义模型 ML Kit 教程作为指南。

根据 Android 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();
                }
            }
        });

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

先感谢您!

4

2 回答 2

0

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

例如在您的活动中:

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;
于 2020-09-14T07:49:00.837 回答
0

您发布的示例代码已经提供了直接访问 OnSuccessListener 中数据的示例。如果您想绘制边界框或打印检测到多少个对象......,我们可以在那里做。
但是,如果您想稍后存储和访问这些数据,您可以按照 Nikos 提到的方式存储它。

于 2020-09-15T17:57:13.983 回答