zoukankan      html  css  js  c++  java
  • DrawTool多重笔之前奏 => 通过InkAnalyzer实现图形识别

    这里要介绍的是通过InkAnalyzer来实现简单图形的识别,例如圆,椭圆,正方形,三角形等,当然你也可以通过扩展来实现自定义图形的识别,在使用InkAnalyzer前,你需要引用IAWinFX.dll才能保证InkAnalyzer正常的工作.

    ps:通过InkAnalyzer实现简单的图形的识别,并不是什么很高深的技术,除了InkANalyzer你也可以通过现有的一些算法来实现笔迹到图形的识别转换,只是我们工作在window平台下,使用的是Net技术,所以没有重复造轮子的必要了,这篇文章其实是Drawtool工具的中一个小功能就是图形识别笔了。对于drawtool来说除了需要具备画笔,荧光笔,flash笔,排笔,纹理笔等外还需要一个图形识别笔的支持.

    代码相对简单,相关类的使用可以参考msdn,这是你最好的伙伴了. 

    对于自定义的图形的识别,你可以在_internalAnalyzer函数中,当drawingNode.GetShapeName返回的名称为other时候,然后根据笔迹进行分析,其实就是点分析算法的应用了

        /// <summary>
        /// 图形识别类
        /// </summary>
        public class ShapeRecogniser
        {
            public InkAnalyzer _inkAnalyzer = null;
    
            private ShapeRecogniser()
            {
                this._inkAnalyzer = new InkAnalyzer
                {
                    AnalysisModes = AnalysisModes.AutomaticReconciliationEnabled
                };
            }
    
            /// <summary>
            /// 根据笔迹集合返回图形名称字符串
            /// </summary>
            /// <param name="strokeCollection"></param>
            /// <returns></returns>
            public string Recognition(StrokeCollection strokeCollection)
            {
                if (strokeCollection == null)
                {
                    MessageBox.Show("dddddd");
                    return null;
                }
    
                string result = null;
                try
                {
                    this._inkAnalyzer.AddStrokes(strokeCollection);
                    if (this._inkAnalyzer.Analyze().Successful)
                    {
                        result = _internalAnalyzer(this._inkAnalyzer);
                        this._inkAnalyzer.RemoveStrokes(strokeCollection);
                    }
                }
                catch (System.Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
    
                return result;
            }
    
            /// <summary>
            /// 实现笔迹的分析,返回图形对应的字符串
            /// 你在实际的应用中根据返回的字符串来生成对应的Shape
            /// </summary>
            /// <param name="ink"></param>
            /// <returns></returns>
            private string _internalAnalyzer(InkAnalyzer ink)
            {
                try
                {
                    ContextNodeCollection nodecollections = ink.FindNodesOfType(ContextNodeType.InkDrawing);
                    foreach (ContextNode node in nodecollections)
                    {
                        InkDrawingNode drawingNode = node as InkDrawingNode;
                        if (drawingNode != null)
                        {
                            return drawingNode.GetShapeName();
                        }
                    }
                }
                catch (System.Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
    
                return null;
            }
    
    
            private static ShapeRecogniser instance = null;
            public static ShapeRecogniser Instance
            {
                get
                {
                    return instance == null ? (instance = new ShapeRecogniser()) : instance;
                }
            }
        }

    应用其实很简单的,你可以在你任何程序上添加一个InkCanvas,然后在鼠标up或者其你觉得适合地方通过调用ShapeRecogniser的Recognition方法,然后根据返回的图形的名称生成对应的shape

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    eclipse导出maven java project为jar包,包含第三方依赖jar包以及普通Java Project 导出包含第三方
    Joda-Time 工具类的使用
    spring-boot 分布式定时任务锁shedlock
    [DB][MyBatis]利用mybatis-paginator实现分页(目前看到MyBatis下最好的分页实现)
    KafKa脚本
    Es重建索引
    Canal1.1.4同步数据至Es时间格式问题
    CDH5.12.1添加Phoenix4.14
    CDH5.12.1利用Sqoop将mysql数据导入hive
    CDH5.12.1将Spark1.6升级到Spark2.2
  • 原文地址:https://www.cnblogs.com/andy1987/p/4347228.html
Copyright © 2011-2022 走看看