5

Androidのジェスチャによる手書き文字検出のサンプル作業を行っています。1文字ずつ入力するとうまくいきます。つまり、ジェスチャーで画面にAを書くと、プログラムはそれをうまく認識します(以前にジェスチャーライブラリに入れました)。今のところ、私はこのようにコーディングしています。

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

if (predictions.size() > 0 && predictions.get(0).score > 1.0) {

    String letter = predictions.get(0).name;  

    Toast.makeText(this, letter, Toast.LENGTH_SHORT).show();

    if(letter.contains("A"))  //when matches i print it to edittext
    edittext.setText("A");
    .
    .      //rest of stuff here like previous way
    .

    }
}

しかし、私の基準はそうではありません。単語を認識したい。asのように一度に一言書きたい。 例

そして、成功したマッチごとに単語を書き込んでいる間、対応する文字が as のように edittext に出力されるべきです。

A,N,D,R,O,I,D

だから私の質問は、どうすればそれを得ることができますか? ジェスチャをセグメント化することは可能ですか (書き込み中に単語をセグメント化する)?実際のコード例やリンクをいただければ幸いです。

4

1 に答える 1

4

質問で与えられた画像に示されているように、単語を別々の文字で書く場合 (つまり、筆記体ではない場合)。次に、これを行うだけです-

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

    if (predictions.size() > 0) {
        Prediction prediction = predictions.get(0);
        String letter = prediction.name;

        if (prediction.score > 1.0) {
            edittext.setText(edittext.getText().toString() + letter);
        }
    }
}

これは基本的に、新しい文字を既存の edittext 文字列に追加することです。

しかし、筆記体について話している場合、それは非常に複雑です。以下は、筆記体を追跡できるコードです。

public class MainActivity extends Activity {
    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Tracker t = new Tracker();
        t.start();
    }

    @Override
    protected void onPause() {
        if (mHandler != null) 
            mHandler.getLooper().quit();
        super.onPause();
    }   

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            if (mHandler != null) {
                Message msg = Message.obtain();
                msg.obj = event.getX() + "," + event.getY();
                mHandler.sendMessage(msg);
            }
            break;
        }
        return true;
    }

    private class Tracker extends Thread {
        private static final int LETTER_SIZE = 30;

        private GestureLibrary gLib;
        private ArrayList<GesturePoint> points;

        public Tracker() {
            points = new ArrayList<GesturePoint>();
            gLib = GestureLibraries.fromRawResource(MainActivity.this, R.raw.gestures);
            gLib.load();
        }

        @Override
        public void run() {
            Looper.prepare();
            mHandler = new Handler() {

                public void handleMessage(Message msg) {
                    String[] pos = String.valueOf(msg.obj).split(",");
                    points.add(new GesturePoint(Float.parseFloat(pos[0]), Float.parseFloat(pos[1]), System.currentTimeMillis()));

                    if (points.size() < LETTER_SIZE) return;

                    GestureStroke stroke = new GestureStroke(points);
                    Gesture gesture = new Gesture();
                    gesture.addStroke(stroke);

                    ArrayList<Prediction> predictions = gLib.recognize(gesture);
                    if (predictions.size() > 0) {
                        Prediction prediction = predictions.get(0);
                        String letter = prediction.name;

                        if (prediction.score > 1.0) {
                            Log.e("Found", letter);
                            points.clear();
                        }
                    }
                }
            };          
            Looper.loop();
        }
    }   
}

したがって、基本的にはタッチ位置をキャプチャし、そこから GestureLibrary の認識() メソッドに渡す Gesture を作成します。ジェスチャが認識されると、それを印刷してタッチ位置をクリアし、新しい文字を認識できるようにします。

サンプル プロジェクト: Cursive_eclipse_project.zip

于 2013-04-15T19:00:27.693 に答える