要求离线识别,不能接外网
识别手写文字分为3步

  1. 第一步,做手写板
  2. 第二步,截取游戏画面
  3. 第三步,识别

第一步,做个手写板
我们可以使用LineRender实现手写板功能
具体思想为,读取鼠标位置,当鼠标的位移超过阈值时,为LineRender添加一个新点,听起来不靠谱,但实际上效果还不错

public class DrawLine : MonoBehaviour
{/// <summary>/// 线条的父物体/// </summary>private Transform lineParent;/// <summary>/// 线的材质 修改这个材质的颜色可以更改线的颜色/// </summary>private Material lineMaterial;/// <summary>/// 画笔的宽度/// </summary>public float paintSize = 3;/// <summary>/// 如果鼠标按下/// </summary>public bool isMouseDown = false;/// <summary>/// 当前的线条绘制器/// </summary>private LineRenderer currentLine;/// <summary>/// 当前的鼠标位置/// </summary>private Vector3 currentMousePostion;/// <summary>/// 上一个鼠标的位置/// </summary>private Vector3 lastMosuePostion;/// <summary>/// 当前笔记的所有点/// </summary>private List<Vector3> points = new List<Vector3>();private new void Awake(){base.Awake();lineParent = GameObject.Find("LineParent").transform;lineMaterial = Resources.Load<Material>("Material/LineMaterial");}private void Update(){if (Input.GetMouseButtonDown(0)){GameObject newLine = new GameObject();newLine.transform.parent = lineParent;currentLine = newLine.AddComponent<LineRenderer>();currentLine.materials[0] = lineMaterial;currentLine.startWidth = paintSize;currentLine.endWidth = paintSize;isMouseDown = true;            }if (isMouseDown){//当前的鼠标的位置currentMousePostion = Input.mousePosition;currentMousePostion = new Vector3(currentMousePostion.x, currentMousePostion.y, 10);//超出阈值,添加一个新的点,阈值自己定if (Vector3.Distance(currentMousePostion, lastMosuePostion) >= 1f){AddLinePoint(currentMousePostion);lastMosuePostion = currentMousePostion;}}if (Input.GetMouseButtonUp(0)){isMouseDown = false;currentLine = null;lastMosuePostion = Vector3.zero;points.Clear();}}/// <summary>/// 添加线的点/// </summary>private void AddLinePoint(Vector3 pos){points.Add(pos);currentLine.positionCount = points.Count;currentLine.SetPositions(points.ToArray());}/// <summary>/// 清理已经画好的点/// </summary>public void ClearLine(){for (int i = 0; i < lineParent.childCount; i++){Destroy(lineParent.GetChild(i).gameObject);}}}

Unity中的相关物体:所有的线条都是这个物体的子物体

注意,我是用的分辨率是1920*1080,使用屏幕坐标画出的线非常巨大,每个像素都是1米,所以我将主相机放在x960y540的的位置,如果你觉得太大,可以使用射线检测一个背景Plane,用射线击中点,代替屏幕坐标,可以有效降低线的尺寸
效果:


第二步 截取游戏画面
有三种不同的截图方式可供我们选择
1 使用ScreenCapture

Texture2D texture2D = ScreenCapture.CaptureScreenshotAsTexture();

但只能全屏截图,会截到不需要的UI

2使用Texture2D读取屏幕像素

        Rect rect = new Rect(0, 0, Screen.width, Screen.height );        Texture2D resultTexture = new Texture2D(Screen.width, Screen.height);resultTexture.ReadPixels(rect, 0, 0);//将自动读取屏幕上的像素resultTexture.Apply();

可以自定义读取的矩形区域,Rect的四个参数分别为 起始坐标X,起始坐标Y,从起始坐标向右读多少像素,从起始坐标向上读多少相许 ,例子中的起始坐标(0,0),是屏幕的左下角

但是这么做的问题在于,依然会截到UI,而且如果是多屏幕,他截取的那个屏幕不一定,根据实验应该是最后激活的屏幕

3使用相机的RenderTexture
本方法基于方法2,只不过Textrue2D不再读取屏幕像素,而是读取RenderTexture

        //声明一个临时的渲染纹理,如果不用临时纹理,也可以在Assets里新建一个RenderTexure,拖给相机的targetTexure属性,但是注意有RenderTexture的相机将不会向game窗口输出画面RenderTexture renderTexture = new RenderTexture(Screen.width,Screen.height,0);uiCamera_2.targetTexture = renderTexture;uiCamera_2.Render();//让相机渲染一帧//激活渲染纹理,Textrue2D将读取这个纹理的像素,而不读取屏幕,如果不激活,将读取屏幕RenderTexture.active = renderTexture; Rect rect = new Rect(0, 0, Screen.width, Screen.height );        Texture2D resultTexture = new Texture2D(Screen.width, Screen.height);resultTexture.ReadPixels(rect, 0, 0);resultTexture.Apply();uiCamera_2.targetTexture = null;//将相机画面重新输出到game窗口

这么做的好处是,截到的画面只和相机拍到的画面有关,因此可以屏蔽UI,并且不受Display窗口限制


第三步,文字识别
研究了一些方法,发现只用unity是不行的(主要是因为识别文字的程序包和Untiy冲突),需要外接c#程序,我使用的是winform程序,通过Unity调用winform程序,通过udp通信完成文字识别

首先新建一个winform程序
右键解决方案,打开Nuget包管理

切换到浏览,搜索PaddleOCRSharp,并安装

引入命名空间

using PaddleOCRSharp;

编写代码

 private void GetOCR(){Bitmap bitmap = new Bitmap("d://ocr.png");//启动引擎  引擎启动比较耗时,可以提前启动,待程序完成再释放OCRModelConfig config = null;OCRParameter oCRParameter = new OCRParameter();OCRResult oCRResult = new OCRResult();PaddleOCREngine engine = new PaddleOCREngine(config,oCRParameter);oCRResult = engine.DetectText(bitmap);Console.WriteLine(oCRResult.Text);//释放引擎engine.Dispose();//释放图片bitmap.Dispose();}

此处只是识别演示代码,可以实现最基本的识别

注意:字不可以太大,也不可以太小,会影响结果,不能识别连笔

工程完整代码
winform已经放入untiy,Untiy工程可以直接单独运行,无需启动winform
winform程序用于展示代码

免积分下载

unity 手写板 截取游戏画面 识别手写文字 全家桶相关推荐

  1. 不知道怎么识别手写文字?快来看这些手写文字识别成文档软件

    平时在上课的时候,我们经常需要通过记笔记的方式将老师讲的课堂知识点记录下来,方便课后复习巩固.而有些勤奋的小伙伴为了能够时时刻刻进行复习,还会将纸质笔记整理成电子版便于日常查看.其实他们正是通过一些识 ...

  2. 三分钟学会怎样识别手写文字

    上大学的时候,为了方便记笔记,我购买了平板电脑和电子笔.在熟悉完基本的操作步骤后,我就准备将之前记录在笔记本上的手写笔记导入到平板中.不过之前没有这方面的经验,于是我就上网搜索了一下哪些软件可以识别手 ...

  3. 手写识别ocr java,怎么识别手写文字?迅捷OCR文字识别软件帮你快速完成!

    怎么识别手写文字?虽然现在手机.平板等设备已经普及开来,但是从小在学校养成的习惯,还是让大部分人选择会手写的方式.手写其实也有很大的缺陷,无论是在生活中还是在网络上进行分享都比较困难. 那么有没有将手 ...

  4. Qt怎么实现将bmp图片转换成Ascii_怎么识别手写文字?迅捷OCR文字识别软件帮你快速完成...

    怎么识别手写文字?虽然现在手机.平板等设备已经普及开来,但是从小在学校养成的习惯,还是让大部分人选择会手写的方式.手写其实也有很大的缺陷,无论是在生活中还是在网络上进行分享都比较困难. 那么有没有将手 ...

  5. 识别手写文字如何操作?这个识别手写文字的软件推荐给你

    识别手写文字是一项基于人工智能的技术,它的产生可以追溯到20世纪60年代.随着计算机技术的不断发展,识别手写文字技术得到了进一步的发展和应用.目前,识别手写文字技术已经被广泛应用于各个领域. 比如,通 ...

  6. 三款软件让你学会怎么识别手写文字内容

    这几天,我正在准备一份重要的报告,需要整理大量手写笔记中的文字信息.但是,由于内容全部都是手写文字,所以目前手上有的识别软件无法快速地将它们转换为电子文本.于是,我就开始寻找解决办法.在经过了一段时间 ...

  7. 三款软件帮你轻松识别手写文字

    随着数字化时代的来临,有时我们需要将一些手写的纸质版文件转写为电子版,如果采用人工输入这种方法,不仅费时费力,还有可能因为失误导致信息缺失或错误. 所以,现在越来越多的人选择使用手写识别文字app进行 ...

  8. 怎么在线识别手写文字?好用软件讲解

    随着数字化时代的到来,越来越多的人开始使用数字设备来记录和传输信息.但是,有时候我们仍然需要手写笔记或签名.此时,如何将手写文字转化为电子文本就成为了一个问题.在线识别手写文字可以将手写内容快速转换为 ...

  9. 以下这些识别手写文字图片的软件你都知道吗

    最近我身体不舒服去看中医了,但是医生开的药方居然是手写的,我想保存下来,下次再开同样的药都没办法,因为我看不懂他写的字.要是有个软件可以识别手写文字图片就好了. 于是我在网上找了找,果然被我找到了三个 ...

最新文章

  1. linux C 内存管理方式之半动态
  2. invalid character found in the request target 异常
  3. UDP Socket编程 C/C++实现 (Windows Platform SDK)
  4. 基于Jenkins+Gitlab的自动化部署实战
  5. java告警系统设计_告警系统的设计
  6. coco数据集大小分类_Microsoft COCO 数据集
  7. ef oracle 批量更新慢_详解Oracle中多表关联批量插入、批量更新与批量删除
  8. 给 TComboBox 添加图标 - 回复 heyongan 的问题
  9. SSM项目使用junit单元测试时Mybatis通配符加载Mapper不能正常加载
  10. DelphiXe7开发酒店APP系统
  11. 4 数据操作+数据预处理
  12. boost电路输出电流公式_开关电源BOOST拓扑计算公式和参考分析
  13. php 联合查询,多表联合查询
  14. MenuetOS小系统安装
  15. python基础学习与应用
  16. GNS与WireShark安装流程
  17. [转]关于日语学习方法之我见
  18. 2019年度个人计划
  19. IntelE3 E5 E7 至强命名规则
  20. 提高雅思听力成绩必须培养的能力

热门文章

  1. 如何在VR场景中位移与行走Unity VRTK - SteamVR Unity Toolkit针对VR开发的工具包
  2. Docker部署Angular+Nginx+uwsgi+Django项目
  3. S5P4418: RTL8152B网卡驱动移植
  4. 从立项到发布仅三个月,开源技术问答社区 Answer 是如何诞生的?
  5. “Rimon天气”Android天气查询软件项目总结
  6. 从bag包中提取图片和点云数据为pcd格式点云文件
  7. 实验二 数据选择器的设计与vivado集成开发环境【Verilog】
  8. 3D月光宝盒游戏机模拟器方案源码项目解析(1)
  9. Java--创建窗口和程序片
  10. R语言ggplot2可视化:可视化时间序列季节图、使用季节图可以比较不同年份相同月份的数据差异、或者相同(年/月/周等)的时间序列在同一天的数据差异(Seasonal Plot)