2012-05-16 23:17:51 xmm218 阅读数 150

http://www.iteye.com/topic/288045



你可以在线测试: http://quake.3322.org/

我最先google到一个开源的手写输入引擎是Tomoe: http://tomoe.sourceforge.jp,它包括识别引擎,整套的用户界面(GTK)以及SCIM的输入法模块,最初是只支持识别日文,在0.6.0版本red hat的工程师贡献了简体中文字典。因为在android系统上已经有很好的用户界面支持(触摸屏api),其实只需要一个识别引擎就可以了,Tomoe的代码太多,学习起来比较耗费时间。后来在Tomoe的邮件列表上发现了Zinnia: http://zinnia.sourceforge.net/,这个东西很小巧,也很有特色:
1. 基于SVM,识别率高
2. 基于C++标准库,容易移植
3. 提供线程安全库,C/C++/Perl/Ruby/Python容易调用
4. 训练速度和识别速度都很快,识别据说可以达到50~100字/秒

安装zinnia很简单,下载源代码以后解压缩编译安装即可:

Shell代码 复制代码 收藏代码
  1. ./configure
  2. make
  3. sudo make install
./configure
make
sudo make install


因为我对ruby比较熟悉,顺便测试了一下它的ruby库调用,在zinnia源代码目录下面有个ruby目录,运行

Shell代码 复制代码 收藏代码
  1. ruby extconf.rb
  2. make
  3. sudo make install
ruby extconf.rb
make
sudo make install


就可以安装好它的ruby扩展库,如何调用代码可以看一下ruby目录下面的test.rb
Zinnia通过解析用户输入的笔画顺序以及坐标,列出前N个最合适的文字,输入字符串包括画布宽度/高度以及坐标值,格式如下:

Zinnia代码 复制代码 收藏代码
  1. (character
  2. (width canvas width)
  3. (height canvas height)
  4. (strokes
  5. ((0-th-stroke 0-th-strokey) ... (0-th-stroke 0-th-strokey))
  6. ((1-th-stroke 0-th-strokey) ... (1-th-stroke 1-th-strokey))
  7. ((2-th-stroke 2-th-strokey) ... (2-th-stroke 2-th-strokey))
  8. ...))
(character
 (width canvas width)
 (height canvas height)
 (strokes
   ((0-th-stroke 0-th-strokey) ... (0-th-stroke 0-th-strokey))
   ((1-th-stroke 0-th-strokey) ... (1-th-stroke 1-th-strokey))
   ((2-th-stroke 2-th-strokey) ... (2-th-stroke 2-th-strokey))
   ...))



前面的demo是抄袭一个基于ajax的日文手写输入Demo:http://www.chasen.org/~taku/software/ajax/hwr/,后台是通过ruby调用zinnia,你可以从附件下载到源代码。
测试下来有少量的字识别率不高,比如"子","人"等,猜测可能和模型数据和算法都有关系。

因为zinnia是基于C++的,下一步要学习一下如何在android上交叉编译,过一段时间再写第2篇博客介绍。

  • 大小: 70.1 KB
2015-11-03 10:35:57 tiankong_bear 阅读数 2025

前段时间由于输入文字需要,偶然想到可以把android手机当做手写板来使用。 所以有了一点开发此软件的想法。

虽然立刻就在网络上搜索到了同类工具,并立即投入使用。 但是后来还是自己花了几天功夫做了一个。


主要工作时间都花在细节上的改进和修正。

功能虽然简单,但是经过反复测试。精简架构 高效稳定。 


计算机端使用c/c+编写。 移动端:android/java  使用wifi网络互连


效果图

   


资源


工具下载:

http://download.csdn.net/detail/tiankong_bear/9235989


废话不多说,源码供参考:

http://download.csdn.net/detail/tiankong_bear/9235963



2009-06-26 21:56:00 linux_lyb 阅读数 5149

  在实现手写联想输入的时候,为了快捷,直接使用了PinyinIME的引擎服务。PinyinIME的引擎服务里提供了接口,根据传入的上下文,查询词组。具体使用可以参考PinyinIME的实现。

 

这样做的好处是:

 1、不用自己实现这个功能,直接使用就行;

 2、跟PinyinIME的词库同步;

 3、未来可以使用户输入习惯在手写和拼音间保持一致。

 

缺点是:

 1、联想输入依赖PinyinIME

 

 

碰到一个问题,直接引用PinyinIME.jar会出错,有谁知道怎么引用PinyinIME引擎的服务么? 现在的做法是复制一个IPinyinDecoderService.java到项目代码目录里。

 

2014-09-30 16:38:21 twan1983 阅读数 1063
首页>Win8.1之家>Win8平板电脑 Surface Pro 3除了自带手写笔,还有这个 2014-9-29 19:01:11来源:IT之家 原创作者:玄隐责任编辑:玄隐人气:15684评论:25  IT之家(www.ithome.com):Surface Pro 3除了自带手写笔,还有这个  IT之家报道,微软Surface Pro 3搭配手写笔,带来更好的输入体验,但是除了自带的,还有没有选择呢?Neo Smartpen 2是第三方厂商的手写笔,适用于Windows、安卓和iOS应用等,而且书写速度也很快。
2015-11-22 13:34:42 zhangphil 阅读数 3020


Android手绘手写图DrawableView

Android上的第三方开源DrawableView支持手写,类似于写字板。DrawableView支持改变画笔颜色,画笔线条粗细,画布的手势缩放和拖曳显示部分区域。并最终支持将手绘的图保存到本地。
在github上的项目主页:https://github.com/PaNaVTEC/DrawableView
先把布局文件中写一个DrawableView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <Button
            android:id="@+id/strokeWidthPlusButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="画笔宽度+" />

        <Button
            android:id="@+id/strokeWidthMinusButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="画笔宽度-" />

        <Button
            android:id="@+id/changeColorButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="画笔颜色" />

        <Button
            android:id="@+id/undoButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="撤销上一步" />
        
         <Button
            android:id="@+id/saveButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="保存成图片" />
        
    </LinearLayout>

    <me.panavtec.drawableview.DrawableView
        android:id="@+id/paintView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>


Java代码:

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import me.panavtec.drawableview.DrawableView;
import me.panavtec.drawableview.DrawableViewConfig;

public class MainActivity extends Activity {

	private DrawableView drawableView;
	private DrawableViewConfig config = new DrawableViewConfig();

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

		drawableView = (DrawableView) findViewById(R.id.paintView);
		

		// 画笔宽度-
		Button strokeWidthMinusButton = (Button) findViewById(R.id.strokeWidthMinusButton);

		// 画笔宽度+
		Button strokeWidthPlusButton = (Button) findViewById(R.id.strokeWidthPlusButton);

		// 改变画笔颜色
		Button changeColorButton = (Button) findViewById(R.id.changeColorButton);

		// 撤销上一步绘画操作
		Button undoButton = (Button) findViewById(R.id.undoButton);

		Button saveButton = (Button) findViewById(R.id.saveButton);

		// 画笔颜色
		config.setStrokeColor(Color.RED);

		// 画布边界
		config.setShowCanvasBounds(true);

		// 设置画笔宽度
		config.setStrokeWidth(10.0f);

		// 缩放
		config.setMinZoom(1.0f);
		config.setMaxZoom(3.0f);

		// 高和宽
		config.setCanvasHeight(500);
		config.setCanvasWidth(700);

		drawableView.setConfig(config);

		strokeWidthPlusButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 增宽则每次增加10
				config.setStrokeWidth(config.getStrokeWidth() + 10);
			}
		});

		strokeWidthMinusButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 减宽则每次减小10
				config.setStrokeWidth(config.getStrokeWidth() - 10);
			}
		});

		changeColorButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 测试期间,随机生成一些颜色
				Random random = new Random();
				config.setStrokeColor(Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256)));
			}
		});

		undoButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				drawableView.undo();
			}
		});

		saveButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				try {
					saveBitmapToSDCard();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}

	// 将用户手绘的DrawableView转化为图片保存到本地系统默认的图片库中。
	private void saveBitmapToSDCard() throws IOException {

		// 从DrawableView获得Bitmap
		Bitmap bmp = drawableView.obtainBitmap();

		File parent_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

		File f = new File(parent_path.getAbsoluteFile(), "myDrawableView.png");
		f.createNewFile();

		Log.d("保存图片的路径", f.getAbsolutePath());

		FileOutputStream fos = new FileOutputStream(f);
		bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
		fos.flush();
		fos.close();

		Log.d("保存图片", "成功");
	}
}



运行结果如图:



默认的,在未发布的debug阶段,DrawableView会在画布上添加一些log日志输出。如果不打算在画布中显示log,可以修改DrawableView的源代码去掉DrawableView默认的log日志。关键代码有两行,在CanvasDrawer的库文件源代码中:

initLogger();

...

canvasLogger.log(canvas, canvasRect, viewRect, scaleFactor);

将这两行注释掉即可,如图:


附录参考文章:
【文章1】《Android写文件到SDCard的一般过程和代码》链接地址:http://blog.csdn.net/zhangphil/article/details/49976687
【文章2】《Android View转换成图片保存》链接地址:http://blog.csdn.net/zhangphil/article/details/44217539


android 逼真 手写

阅读数 32

没有更多推荐了,返回首页