涂涂乐严格来说有两个版本,一种是前面详细介绍过的,鼠标控制画图截图发送给服务端实现模型上色;另一种是通过实物图彩笔绘图之后通过扫描仪生成图片发送给服务端来实现模型上色。

动物模型有多种,贴图有多种,在画板的版本中,我们可以通过图片名称来识别图片来给具体的模型上色;但在扫描仪的版本中,我们无法确定图片名称,因此我们需要一种方法实现图片的识别。基本思路是在实物图的右下角印制不同字母,通过识别字母来确定图片。接下来的问题就在于如何识别图片上的字母了。

我最初的想法是写一个简单的算法来比较图片右下角来实现,但考虑到诸多原因(分辨率;扫描仪不能完全正确扫描图片位置等)只好放弃寻找其它方法,最终发现了EmguCV,在官方OCR的案例中找到了可以完全实现识别图片上字母的功能。然而新的问题是貌似几乎没有人使用unity来调用Emgu,在配置unity的过程中出现了一些问题,基本过程就是在unity的project中新建一个plugins文件夹添加了几十个.dll文件。然后在buildingsetting中的optimiza中将.net设为2.0。

在官方的案例中,我们只需获得图片路径调用一个函数就搞定了。在我要实现的功能中,客户端检测文件夹发送图片到服务端,服务端得到的是byte[],这里是这步之后的操作。

using UnityEngine;
using System.Collections;
using Emgu.CV;
using Emgu.CV.OCR;
using Emgu.CV.Util;
using Emgu.CV.UI;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System.Runtime.InteropServices;
using System;
using System.Drawing;
using System.IO;public class EmguTest : MonoBehaviour
{private Tesseract _ocr;void Start(){}public static  void GetBytes(byte[] bytes){string LetterPath;//LetterPath = Application.dataPath + "/ServerGet/Letter";LetterPath = Directory.GetParent(Application.dataPath) + "/ServerGet/Letter";if (!Directory.Exists(LetterPath)){Directory.CreateDirectory(LetterPath);}string filename = System.DateTime.Now.Year.ToString("0000") + System.DateTime.Now.Month.ToString("00") +System.DateTime.Now.Day.ToString("00") + System.DateTime.Now.Hour.ToString("00") +System.DateTime.Now.Minute.ToString("00") + System.DateTime.Now.Second.ToString("00") +UnityEngine.Random.Range(0, 9999).ToString("0000");FileStream file = new FileStream(LetterPath+"/"+filename+".png",FileMode.Create);file.Write(bytes, 0, bytes.Length);file.Flush();file.Close();Tesseract _ocr;_ocr = new Tesseract(Application.dataPath+"//tessdata", "eng", OcrEngineMode.TesseractCubeCombined);Image<Bgr, byte> picture = new Image<Bgr, byte>(LetterPath + "/" + filename + ".png");Bgr myWhiteColor = new Bgr(255, 0, 255);using (Image<Gray, byte> gray = picture.Convert<Gray, Byte>()){_ocr.Recognize(gray);Tesseract.Character[] characters = _ocr.GetCharacters();foreach (Tesseract.Character c in characters){picture.Draw(c.Region, myWhiteColor, 1);}String text = _ocr.GetText();Debug.Log("text:" + text);}}}

example:对于图片

识别结果为:

除了字母q被识别成了Cl之外,其它字母都得到了正确的识别。

这样我们就可以给不同的动物图右下角标记不同字母,这样就实现了识别图片的功能。

这里顺便写一下我遇到的问题之一:我们需要的来自扫描仪的动物图应该是横向的,但扫描仪的结果是纵向的,我们得到纵向图后需要将其顺时针旋转九十度生成横向图,代码如下:

Texture2D rotateNinty(Texture2D tex){Texture2D TextureRotate = new Texture2D(tex.height, tex.width);for (int widthi = 0; widthi < tex.width; widthi++)for (int heighti = 0; heighti < tex.height; heighti++){int a = widthi;int b = heighti;int m = StartTexture[0].width / 2;int n = StartTexture[0].height / 2;TextureRotate.SetPixel(b - n + m, m - a + n, tex.GetPixel(widthi, heighti));}TextureRotate.Apply();return TextureRotate;}

实际上解决的问题是,平面上任一点绕指定点旋转一定角度的算法。

平面上一点(a,b)绕(m,n)顺时针旋转九十度后的坐标为(b-n+m,m-a+n)。用两个for循环为整个Texture的每一个像素点设置相应位置来得到新的Texture,接下来才是截取右下角的字母格,最后应用EmguCV识别字母。

涂涂乐的详细实现之四--unity3d调用EmguCV实现图片识别相关推荐

  1. 涂涂乐的详细实现之一--画笔核心功能

    涂涂乐绘图板算是我独立完成的第二个项目,从无到有算起来大概花了一个多月的时间.其中碰到了许许多多的坑,同时也补充了各种各样的知识,总之收获挺大.接下来大概分成五个部分详细介绍各部分功能的实现方法. ( ...

  2. 涂涂乐的详细实现之三--文件IO操作

    这篇内容旨在详细介绍我在完成涂涂乐这个项目中用到的关于文件存储命名等的思路和操作. (一)截图操作 截图的基本思路:在绘图区域确定一个矩形,创建一个Texture2D获取这部分像素并生成图片存储在文件 ...

  3. unity3D AR涂涂乐制作浅谈

    unity3D AR涂涂乐制作浅谈 AR为现在是虚拟现实较为火爆的一个技术,其中有个比较炫酷的就是AR涂涂乐的玩法,这个技术可以把扫描到的图片上的纹理 粘贴到模型上实现为模型上色的功能,但是我们需要怎 ...

  4. unity3D 涂涂乐使用shader实现上色效果

    之前我博文里面发过一个简单的通过截图方式来实现的模型上色方法,但是那个方法不合适商用,因为你需要对的很准确才可以把贴图完美截取下来,只要你手抖了一下就会发现贴歪了.那么有没有更好的方法来实现这个效果呢 ...

  5. EasyAR4.0使用说明(Unity3D)三----平面图像跟踪扩展:视频播放,涂涂乐

    播放视频 平面图像识别以后播放视频也是一种经常被用到的增强现实的表现方式.通常是截取视频第一帧的图片作为识别图片,识别以后播放视频.这样就给人一个图片动起来的错觉. 在场景中设置Main Camera ...

  6. 手把手教你做个AR涂涂乐

    前段时间公司有一个AR涂涂乐的项目,虽然之前接触过AR也写过小Demo,但是没有完整开发过AR项目.不过经过1个多星期的学习,现在已经把项目相关的技术都学会了,在此向互联网上那些乐于分享的程序员前辈们 ...

  7. ​手把手教你做个AR涂涂乐 ​

    前段时间公司有一个AR涂涂乐的项目,虽然之前接触过AR也写过小Demo,但是没有完整开发过AR项目.不过经过1个多星期的学习,现在已经把项目相关的技术都学会了,在此向互联网上那些乐于分享的程序员前辈们 ...

  8. Unity_6 涂涂乐案例

    前言 最近学习的东西都是一些零零散散的,看了一下笔记,了解了一个地图插件Minimap之类的:还有一些C#语法:委托.Lambda表达式.另外还有有关vuforia,EasyAR Sense,AVPr ...

  9. EasyAR涂涂乐代码分析

    来说一下对EasyAR sdk中自带的unity Samples中的Coloring3D这个项目的理解(例子程序可以去官网下载 最后会列出所有用到网站的网址). 这个项目的效果就是我们常见的" ...

最新文章

  1. 区块链游戏为何只剩下“炒币”的价值?
  2. Boost::context模块fiber的jump测试程序
  3. 低照度监控前景广阔 企业展开激烈角逐
  4. Character.isLetterOrDigit(ch)判断ch是否为字母或数字
  5. C# unicode 编码 和 解码
  6. Django连接mysql数据库(python3.6)
  7. PAT乙级 1004 成绩排名
  8. shell foreach 拼接字符串_FIND_IN_SET 及IN 处理逗号间隔的字符串参数
  9. decode函数_「实践」云函数 + API,你也可以做个天气信息系统
  10. 【less-2】sqli-labs靶场第二关
  11. angular4-http
  12. 《转》常用的正则表达式
  13. linux 位置参数数组,荐Linux中的shell编程Ⅱ——位置参数、数组、date和cal
  14. php 百度天气,php使用百度天气接口示例
  15. linux c 拒绝服务攻击,低速率拒绝服务攻击原理
  16. ELK环境部署(一)--基础环境配置
  17. 如何用echarts实现颜色渐变半圆形仪表盘
  18. Lucas–Kanade
  19. tomcat页面跳转问题
  20. 餐饮店如何在小红书上引流?小红书转化怎么样

热门文章

  1. 图像处理 Matlab GUI系统(全)
  2. 市场营销工作重中之重——提升工作效率
  3. 使用Python对GIF读取、生成、压缩和加水印
  4. leet55.跳跃游戏
  5. CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/curre
  6. (三)Spring整合RabbitMQSpringBoot 整合RabbitMQRabbitMQ 镜像队列
  7. TIA博途WINCC中英文切换的项目中摄氏度符号无法正常显示的解决办法
  8. Aocoda-RCF7/F7 MINI飞控无法解锁的疑难杂症-使用 Betaflight 10.8.0调参软件地面站刷写固件以及AOCODAF722MINI 配置文件
  9. 计算机英语原文件夹,常用文件夹英文解译
  10. 文件和文件夹的操作——文件流的使用