4

是否可以从正在运行的应用程序中替换模板库的手势模板?我正在构建一个手写识别器系统,其中手势库文件中有字母模板。所以基本上在代码中加载库之后,我比较用户输入手势,如:

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
ArrayList<Prediction> predictions = gesturelib.recognize(gesture);

   if (predictions.size() > 1) {
    for(Prediction prediction: predictions){
       //i compare prediction name here and if matches print it in an edittext
    }

这应该可以很好地工作,直到用户给出与我在构建库模板期间所做的相同的模式。但是我想给用户一种灵活性,当预测不匹配时,可以用他的手写模式替换模板项。

因为以下 2 个手写手势样本在图案方面不同,但不是字母。假设,我的系统支持第一个图像图案,我希望当用户给出第二个图像图案时,系统会要求用户确认以将其替换为A的库模式,确认后替换它。这样下次系统将更好地识别用户模式。

任何帮助将不胜感激。

在此处输入图像描述 在此处输入图像描述

4

1 回答 1

5

如果我理解正确,您想用新手势替换现有手势吗?

因此,当用户输入库中没有的手势时,您的应用会要求用户选择他们希望替换的手势?根据您的问题,我假设当用户绘制小写字母时a(如果a不在库中),用户会看到您的应用当前支持的所有可用手势/字母的列表。然后,用户选择大写A,现在A必须将大写替换为小写a。在下面的代码中,oldGesture 是对应的 Gesture A。并且newGesture是刚刚绘制的手势。

其过程是:删除旧手势,使用旧手势名称添加新手势。要删除手势,请使用 GestureLibrary.removeGesture(String, Gesture):

public void onGesturePerformed(GestureOverlayView overlay, final Gesture gesture) {

    ArrayList<Prediction> predictions = gesturelib.recognize(gesture);

    if (predictions.size() > 1) {

        for(Prediction prediction: predictions){

            if (prediction.score > ...) {

            } else {

                if (user wants to replace) {

                    showListWithAllGestures(gesture);
                }
            }
        }
    }
}

public void showListWithAllGestures(Gesture newGesture) {
    ....
    ....

    // User picks a gesture
    Gesture oldGesture = userPickedItem.gesture;
    String gestureName = userPickedItem.name;

    // delete the gesture
    gesturelib.removeGesture(gestureName, oldGesture);
    gesturelib.save();

    // add gesture
    gesturelib.addGesture(gestureName, newGesture);
    gesturelib.save();

}

要获取所有可用手势的列表:

// Wrapper to hold a gesture
static class GestureHolder {
    String name;
    Gesture gesture;
}

使用 GestureLibrary.load() 加载手势:

if (gesturelib.load()) {

    for (String name : gesturelib.getGestureEntries()) {

        for (Gesture gesture : gesturelib.getGestures(name)) {

            final GestureHolder gestureHolder = new GestureHolder();
            gestureHolder.gesture = gesture;
            gestureHolder.name = name;

            // Add `gestureHolder` to a list

        }
    }

    // Return the list that holds GestureHolder objects

}

编辑:

抱歉,但我建议的检查:if (wants to replace)在代码中的错误位置执行。

if (predictions.size() > 1) {

    // To check whether a match was found
    boolean gotAMatch = false;

    for(int i = 0; i < predictions.size() && !gotAMatch; i++){

        if (prediction.score > ... ) {

            ....
            ....

            // Found a match, look no more
            gotAMatch = true;

        }
    }

    // If a match wasn't found, ask the user s/he wants to add it
    if (!gotAMatch) {

        if (user wants to replace) {

            showListWithAllGestures(gesture);
        }
    }
}
于 2013-09-14T08:55:56.687 回答