• [Unity]OCR识别--Tesseract篇


            在机缘巧合下(其实就是上GitHub无意发现的),找到了一个Tesseract的Unity工程,测试发现不仅识别效果很好,而且支持多平台。

    一、下载工程

    GitHub - Neelarghya/tesseract-unity: Standalone OCR plugin for Unity using TesseractStandalone OCR plugin for Unity using Tesseract. Contribute to Neelarghya/tesseract-unity development by creating an account on GitHub.https://github.com/Neelarghya/tesseract-unity     下载完成后,解压出来。可以直接用Unity打开,我用的是2020.3.3.(工程名称是我自己改的)

         在Scenes目录里的Main是工程的演示路径,直接运行,可以看出识别效果很好。 

     

     效果如下。

         接下来我们要做的就是把他迁移进OpenCV工程。

    二、迁移插件

             在这里我就不导出插件了,直接复制文件夹。我们需要的三个文件夹“Plugins”、“Scripts”和“StreamingAssets”,将它们复制出来,粘贴进OpneCV工程。例如 ,主要是OCR文件夹

    三、插件使用

           新建一个脚本类,我的叫EasyOCR,如下

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using OpenCvSharp;
    5. using OpenCvSharp.Util;
    6. using OpenCvSharp.XFeatures2D;
    7. using System;
    8. public delegate void RecoginzeCall(string a);
    9. public class EasyOCR
    10. {
    11. private TesseractDriver _tesseractDriver;
    12. private bool IsSetUp = false;//确保已经启用成功
    13. private Texture2D mainTexture;//待识别图片
    14. private RecoginzeCall CallBack = null;
    15. public EasyOCR()
    16. {
    17. _tesseractDriver= _tesseractDriver = new TesseractDriver();
    18. //启用OCR,
    19. _tesseractDriver.Setup(OnSetupCompleteRecognize);
    20. IsSetUp = false;
    21. }
    22. public void Recoginze(Mat Img, RecoginzeCall _call)
    23. {
    24. Mat tempImg = Img.CvtColor(ColorConversionCodes.BGR2GRAY).MedianBlur(5).Threshold(185, 255, ThresholdTypes.BinaryInv);
    25. Texture2D temp = OpenCvSharp.Unity.MatToTexture(tempImg);
    26. CallBack = _call;
    27. mainTexture = temp;
    28. OnSetupCompleteRecognize();
    29. }
    30. public void Recoginze(Texture2D _texture, RecoginzeCall _call)
    31. {
    32. Texture2D texture = new Texture2D(_texture.width, _texture.height, TextureFormat.ARGB32, false);
    33. texture.SetPixels32(_texture.GetPixels32());
    34. texture.Apply();
    35. mainTexture = texture;
    36. OnSetupCompleteRecognize();
    37. }
    38. ///懒,就写在一个函数里了
    39. private void OnSetupCompleteRecognize()
    40. {
    41. if(!IsSetUp)
    42. {
    43. IsSetUp = true;
    44. return;
    45. }
    46. //识别,结果会以string形式返回,
    47. string data=_tesseractDriver.Recognize(mainTexture);
    48. if(CallBack!=null)
    49. {
    50. CallBack(data);
    51. }
    52. }
    53. }

            上述代码给了两个检测函数,因为Tesseract对于白底黑字的检测效果会好很多,因此如果你的待检测图片不是黑白的,就需要使用OpenCV进行二值化一下。这点非常重要。

            接下来给个示例代码,我在Update里调用OCR功能实现“伪实时”检测

    1. private EasyOCR OCR;
    2. private Mat CheckMat;
    3. void Start()
    4. {
    5. OCR = new EasyOCR();
    6. ///打开相机
    7. StartCoroutine(OpenCamera());
    8. }
    9. void Update()
    10. {
    11. if (Tex != null && Tex.didUpdateThisFrame)
    12. {
    13. Mat Frame = OpenCvSharp.Unity.TextureToMat(Tex);
    14. OpenCvSharp.Rect Roi = new OpenCvSharp.Rect(760, 440, 400, 400);
    15. CheckTimes++;
    16. if (CheckTimes>24)
    17. {
    18. CheckTimes = 0;
    19. CheckMat = Frame.SubMat(Roi).Clone().Resize(new Size(200, 200));
    20. StartCoroutine(FrameCheck());
    21. }
    22. Cv2.Rectangle(Frame, Roi, new Scalar(0, 255, 255));
    23. Destroy(Capture.texture);
    24. Capture.texture = OpenCvSharp.Unity.MatToTexture(Frame);
    25. }
    26. }
    27. IEnumerator FrameCheck()
    28. {
    29. yield return new WaitForSeconds(0.0f);
    30. //开始检测并给个回调函数
    31. OCR.Recoginze(CheckMat, OnChecked);
    32. }

        上述部分主要是做了一次Resize,改变了Roi区域大小,加快检测速度。对于Tesseract检测来说耗时会很长,因此我是隔一段时间检测一次。对于字体清晰,占图像画面比例较大的,可以适当Resize一下来加快检测进度。

  • 相关阅读:
    (十八)Spring6集成MyBatis3.5
    go面试题 腐烂的苹果(橘子、水果)
    40 个 SpringBoot 常用注解:让生产力爆表
    Jetson NX系统烧录以及CUDA、cudnn、pytorch等环境的安装
    Linux文本处理三剑客(grep,sed,awk)
    vue 大文件断点续传、并发控制、请求重试
    Python 基于docker部署的Mysql备份查询脚本
    样式处理+element-UI
    数据管理生态的核心解析:数据库、数据仓库、数据湖、数据平台与数据中台的关系与实现
    成为Linux大神——必须要具备的基本技能!
  • 原文地址:https://blog.csdn.net/qq_36251561/article/details/127830538