unity源码地址链接:unityc#触摸屏物体识别桌算法-C#文档类资源-CSDN下载

实操的时候出现算出来的坐标不对,没有时间去找问题,优化了,所以代码仅供参考。

使用的是Lean Touch插件,免费的。

模块由三个点构成,基本构成等腰三角形,但是实际是会有误差的。

我的想法是在识别时,1.先计算出所有的边的长度,并记录下坐标。2.然后对比配置文件中的长度,记录符合配置文件的长度。3.然后再对比配置文件中的角度值。

主要算法在OnFingerUpdate()中,Update()中按下W键,则是记录模块的三条边长度和顶角的角度。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Lean.Touch;
using UnityEngine.UI;
using System;public class touchTest : MonoBehaviour
{public Text text;public Text text2;public static List<LeanFinger> Fingers = new List<LeanFinger>(10);private static List<LeanFinger> allFingers = new List<LeanFinger>();//记录模块最后一次的旋转角度,并进行比较,当前是正转是反转private double[] RecordLastAngel = new double[6] { 0, 0, 0, 0, 0, 0 };public GameObject[] MoveObj;public GameObject RecordPage;void Start(){//MoveObj[0].transform.rotation = Quaternion.Euler(Vector3.forward * (float)-60);}private void OnEnable(){LeanTouch.OnFingerUpdate += OnFingerUpdate;LeanTouch.OnFingerDown += OnFingerDown;LeanTouch.OnFingerUp += OnFingerUp;LeanTouch.OnFingerSwipe += OnFingerSwipe;}private void OnDisable(){LeanTouch.OnFingerUpdate -= OnFingerUpdate;LeanTouch.OnFingerDown -= OnFingerDown;LeanTouch.OnFingerUp -= OnFingerUp;LeanTouch.OnFingerSwipe -= OnFingerSwipe;}public class PtoP_Length{public float distances { get; set; }public Vector2 FirstPosition { get; set; }public Vector2 SecondPosition { get; set; }}void OnFingerUpdate(LeanFinger finger){var fingers = LeanTouch.Fingers;text.text = "";if (fingers.Count >= 4){List<PtoP_Length> PtoP_length = new List<PtoP_Length>();PtoP_length.Clear();//Debug.Log("1" + fingers[0].ScreenPosition);//Debug.Log("2" + fingers[1].ScreenPosition);//Debug.Log("3" + fingers[2].ScreenPosition);//Debug.Log("4" + fingers[3].ScreenPosition);//所有点到点的长度for (int i = 1; i < fingers.Count; i++){//text.text += fingers[i].ScreenPosition.ToString() + "|";for (int j = i + 1; j < fingers.Count; j++){double temp = getPointBetweenLength(fingers[i].ScreenPosition, fingers[j].ScreenPosition);//记录点到点的长度和两点的坐标PtoP_Length ppl = new PtoP_Length();ppl.FirstPosition = fingers[i].ScreenPosition;ppl.SecondPosition = fingers[j].ScreenPosition;ppl.distances = (float)(temp);PtoP_length.Add(ppl);text2.text += temp + "|";}}//对比配置文件中的令牌数据List<int> RecordDis = new List<int>();//RecordDis.Clear();for (int i = 0; i < ReadXml.ID.Count; i++){RecordDis.Clear();//对比配置文件中符合距离的数据for (int j = 0; j < PtoP_length.Count; j++){//记录符合距离的数据if (PtoP_length[j].distances > (Convert.ToInt32(ReadXml.DisA[i]) - 10)&& PtoP_length[j].distances < (Convert.ToInt32(ReadXml.DisA[i]) + 10)){RecordDis.Add(j);}else if (PtoP_length[j].distances > (Convert.ToInt32(ReadXml.DisB[i]) - 10)&& PtoP_length[j].distances < (Convert.ToInt32(ReadXml.DisB[i]) + 10)){RecordDis.Add(j);}else if (PtoP_length[j].distances > (Convert.ToInt32(ReadXml.DisC[i]) - 10)&& PtoP_length[j].distances < (Convert.ToInt32(ReadXml.DisC[i]) + 10)){RecordDis.Add(j);}}bool temprecordbool = false;//获取正确角度的数值for (int k = 0; k < RecordDis.Count; k++){for (int l = 0; l < RecordDis.Count; l++){if (temprecordbool == false){for (int o = 0; o < RecordDis.Count; o++){//获取所有可能double temp1 = PtoP_length[RecordDis[k]].distances;double temp2 = PtoP_length[RecordDis[l]].distances;double temp3 = PtoP_length[RecordDis[o]].distances;//获取所有可能的角度double tempangle = GetAngle(temp1, temp2, temp3);//把记录下的角度增减10度左右,因为可能会有误差double angleplus = Convert.ToDouble(ReadXml.Angle[i]) + 10;double anglejian = Convert.ToDouble(ReadXml.Angle[i]) - 10;//然后和所有的角度进行比对if (tempangle <= angleplus && tempangle >= anglejian){//角度正确,即表示temp1为(1,2),temp2为(2,3),temp3为(1,3)或者(3,1)//坐标只有3个点,那么只需要PtoP_length[RecordDis[k]].distances上的两个点//就是第一个和第二个,第二个vet2为顶点坐标,//PtoP_length[RecordDis[l]].distances的第二个坐标即为最后一个坐标点Vector2 vet1 = PtoP_length[RecordDis[k]].FirstPosition;Vector2 vet2 = PtoP_length[RecordDis[k]].SecondPosition;Vector2 vet3 = PtoP_length[RecordDis[l]].SecondPosition;Vector2 centerPoint = GetCiclePoint(vet1, vet2, vet3);MoveObj[i].transform.position = new Vector2(centerPoint.x, centerPoint.y);//计算角度值,角度值为坐标系的上方为:0~180度,坐标系的下方为:-1~-179度//angel = Math.atan2(y, x)double xposition = vet2.x - centerPoint.x;double yposition = vet2.y - centerPoint.y;double roationAngel = Math.Round(Math.Atan2(yposition, xposition), 2);if (roationAngel < 0)roationAngel = roationAngel + 360;//if (RecordLastAngel[i] == 0)   //第一次为空时,记录坐标,后面都是通过获取到的实时角度来和第一次记录的坐标,来进行计算,是正转还是反转RecordLastAngel[i] = roationAngel;//当前旋转的角度,负数为反转,正数为正转double newAngel = roationAngel - RecordLastAngel[i];//if (newAngel > 5 || newAngel < -5)//{text2.text += "编号:" + i.ToString() + "的坐标为" + centerPoint + "角度为:" + roationAngel + "旋转了:" + newAngel;MoveObj[i].transform.rotation = Quaternion.Euler(Vector3.forward * (float)newAngel);temprecordbool = true;//}//MoveObj[i].transform.Rotate(0f, 0f, 2f);//每一帧绕自身坐标轴Z轴旋转2度}//else//{//    //角度不对,即移出屏幕//    MoveObj[i].transform.position = new Vector2(-2000, -2000);//    MoveObj[i].transform.Rotate(0f, 0f, 0f);//    for (int ab = 0; ab < RecordLastAngel.Length; ab++)//    { RecordLastAngel[ab] = 0; }//}}}}}}}}/// <summary>/// 任意两点之间的长度/// </summary>/// <param name="p"></param>/// <param name="p2"></param>/// <returns></returns>double getPointBetweenLength(Vector2 p, Vector2 p2){double value = Math.Sqrt(Math.Abs(p.x - p2.x) * Math.Abs(p.x - p2.x) + Math.Abs(p.y - p2.y) * Math.Abs(p.y - p2.y));return Math.Round(value, 2);}string SanJiao(double b1, double b2, double b3){string ss = "";//首先判断能否组成三角形if (b1 + b2 > b3 && b1 + b3 > b2 && b2 + b3 > b1){//return "可以组成三角形";//判断是怎样的三角形,并输出if (b1 == b2 && b2 == b3){ss = "是等边三角形";}else if (b1 == b2 || b2 == b3 || b1 == b3)ss = "是等腰三角形";else if (b1 * b1 + b2 * b2 == b3 * b3 || b1 * b1 + b3 * b3 == b2 * b2 || b3 * b3 + b2 * b2 == b1 * b1)ss = "是直角三角形";}elsess = "输入的三边不能组成三角形";return ss;}//返回等腰三角形的顶角//但公式不能算出等腰三角形的顶角//令牌的三条边会有误差,正好不形成等腰三角,可以直接调用/// <summary>/// 计算角度/// </summary>/// <param name="a">长度最小的两条边</param>/// <param name="b">长度最小的两条边</param>/// <param name="c">最长的一条边长度</param>/// <returns></returns>double GetAngle(double a, double b, double c){try{double sss = Math.Acos((a * a + b * b - c * c) / (2 * a * b)) / Math.PI * 180;return sss;}catch { return 0; }}//获取三点的中心点Vector2 GetCiclePoint(Vector2 first, Vector2 second, Vector2 thrid){float tempA1;float tempA2, tempB1, tempB2;float tempC1, tempC2;float temp, x, y;tempA1 = first.x - first.x;tempB1 = first.y - second.y;tempC1 = float.Parse(((Math.Pow(first.x, 2) - Math.Pow(second.x, 2) + Math.Pow(first.y, 2) - Math.Pow(second.y, 2)) / 2).ToString());tempA2 = thrid.x - second.x;tempB2 = thrid.y - second.y;tempC2 = float.Parse(((Math.Pow(thrid.x, 2) - Math.Pow(second.x, 2) + Math.Pow(thrid.y, 2) - Math.Pow(second.y, 2)) / 2).ToString());temp = tempA1 * tempB2 - tempA2 * tempB1;if (temp == 0){x = first.x;y = first.y;}else{x = (tempC1 * tempB2 - tempC2 * tempB1) / temp;y = (tempA1 * tempC2 - tempA2 * tempC1) / temp;}return new Vector2(x, y);}void OnFingerDown(LeanFinger finger){//Debug.Log("Finger:" + finger.Index);//text2.text = text2.text + finger.TapCount + "\r\n";}void OnFingerUp(LeanFinger finger){//for (int i = 0; i < text2.Length; i++)//{//    text2[i].text = "";//}}void OnFingerSwipe(LeanFinger finger){//Debug.Log("FingerSwipe:" + finger.ScreenPosition);}public Text text3;void Update(){text3.text = MoveObj[0].transform.position.x.ToString()+","+ MoveObj[0].transform.position.y.ToString();//MoveObj[0].transform.Rotate(0f, 0f, 2f);//每一帧绕自身坐标轴Z轴旋转2度var fingers = LeanTouch.Fingers;//Debug.Log("update:" + fingers.Count);//text.text = text.text + fingers.ScreenPosition + "\r\n";//Debug.Log("Finger:" + LeanGesture.GetTwistDegrees());//LeanGesture.GetTwistDegrees();if (Input.GetKeyDown(KeyCode.D)){RecordPage.SetActive(!RecordPage.activeInHierarchy);}if (Input.GetKeyDown(KeyCode.W) && RecordPage.activeInHierarchy){if (fingers.Count == 3){//记录模块坐标double firstBian = getPointBetweenLength(fingers[1].ScreenPosition, fingers[2].ScreenPosition);double secondBian = getPointBetweenLength(fingers[2].ScreenPosition, fingers[3].ScreenPosition);double thridBian = getPointBetweenLength(fingers[1].ScreenPosition, fingers[3].ScreenPosition);double temp1 = firstBian - secondBian;double temp2 = firstBian - thridBian;double temp3 = secondBian - thridBian;string id = RecordPage.transform.GetChild(0).transform.GetChild(0).transform.GetComponent<Text>().text;if (temp1 <= 10 && temp1 >= -10){double angle = GetAngle(firstBian, secondBian, thridBian);ReadXml.readxml.UpdateXml(id, firstBian.ToString(), secondBian.ToString(), thridBian.ToString(), angle.ToString());}else if (temp2 <= 10 && temp2 >= -10){double angle = GetAngle(firstBian, thridBian, secondBian);ReadXml.readxml.UpdateXml(id, firstBian.ToString(), thridBian.ToString(), secondBian.ToString(), angle.ToString());}else if (temp3 <= 10 && temp3 >= -10){double angle = GetAngle(secondBian, thridBian, firstBian);ReadXml.readxml.UpdateXml(id, secondBian.ToString(), thridBian.ToString(), firstBian.ToString(), angle.ToString());}}}//allFingers.Clear();//allFingers.AddRange(LeanTouch.Fingers);//allFingers.AddRange(LeanTouch.InactiveFingers);//allFingers.Sort((a, b) => a.Index.CompareTo(b.Index));//for (var i = 0; i < allFingers.Count; i++)//{//    var finger = allFingers[i];//    //var progress = touch.TapThreshold > 0.0f ? finger.Age / touch.TapThreshold : 0.0f;//    //var style = GetFadingLabel(finger.Set, progress);//    //if (style.normal.textColor.a > 0.0f)//    //{//    var screenPosition = finger.ScreenPosition;//    var state = "UPDATE";//    if (finger.Down == true) state = "DOWN";//    if (finger.Up == true) state = "UP";//    if (finger.IsActive == false) state = "INACTIVE";//    if (finger.Expired == true) state = "EXPIRED";//    if (finger.Index != -42)//    {//        string sss = finger.Index + " - " + state + "  + " + Mathf.FloorToInt(screenPosition.x) + ", " + Mathf.FloorToInt(screenPosition.y);//    }//}}
}

以下是参考图片和链接

Object Interaction With Touchscreens : 6 Steps (with Pictures) - Instructables

感兴趣的,可以试试在OnFingerDown()中先识别哪个几个点是按下了,然后在OnFingerUpdate()中再处理,会更精准点。因为OnFingerUpdate()中获取到的坐标并不精确。

unity c# 触摸屏物体识别桌算法相关推荐

  1. 物体识别桌 开发系列之一

    物体识别桌 开发系列之一 本系列将会制作一个多点屏的 物体识别桌,从多点屏的usb(hid)touchscreen抓取数据分析识别标签(主动或被动)的特征,从而识别不同的标签的位置和旋转角度,从而做一 ...

  2. 开发物体识别桌、_【课程总结】AR系统开发“秘籍”大揭秘!

    导读:AR技术飞速发展,被广泛应用于游戏.医疗.旅游.电商等行业.那么对于AR系统的整体设计和应用是如何操作的呢?商汤泰坦公开课第006期联合"SLAM技术及应用"暑期学校与研讨会 ...

  3. 开发物体识别桌、_Tofu3 热红外可见光双光AI目标识别跟踪

    1. 概述 1.1 简介 Littro瞳赋Tofu3是多波段视频物体识别跟踪模块,支持可见光视频与红外视频下的物体检测.识别.跟踪.产品支持H.264/H.265视频编码.智能设备管理.目标检测.识别 ...

  4. 电容屏物体识别_触摸屏物体识别到底是怎么实现的

    展开全部 从早期对屏上特征图案进行红外背摄的模式识32313133353236313431303231363533e59b9ee7ad9431333433623664别技术,到通过红外触摸框对屏上凸点 ...

  5. 开发物体识别桌、_【专利解密】华为如何实现物体检测在大规模场景中的应用;苹果卷入其中?三星显示被要求赔偿前副总裁专利侵权费...

    1.[专利解密]华为如何实现物体检测在大规模场景中的应用 助力智慧安防:2.苹果卷入其中?三星显示被要求赔偿前副总裁专利侵权费:3.苹果重申AR具有巨大潜力并且暗示未来可能出现的设备 1.[专利解密] ...

  6. 开发物体识别桌、_想用人工智能实现安全风险管控?快来试试EasyMonitor一站式视频监控开发平台...

    随着 AI 技术的日益成熟,越来越多的传统企业都希望用 AI 能力升级原有的管理系统,进而智能化解决业务问题.提高人效.尤其在安全生产领域中,虽然视频监控的覆盖率逐年提升,但大多企业还在沿用人工抽检的 ...

  7. 开发物体识别桌、_科研人员开发突破性的技术,允许盲人识别形状和物体

    一项令人难以置信的新技术正在让失明人士有能力识别形状和物体,而这些形状和物体都是在他们的大脑上"画出来"的.一篇描述该技术的研究论文刚刚发表在<细胞>杂志上,正如Sci ...

  8. ssd测试软件cy,简析物体识别SSD算法

    [学习笔记,仅作参考,欢迎交流] 发表于 ECCV-2016 的 SSD 算法是继 Faster RCNN 和 YOLO 之后又一个杰出的物体检测算法.与 Faster RCNN 和 YOLO 相比, ...

  9. 高通ar,unity实现3D物体识别,图片识别

    话不多说,直接上干货 1.实现的效果: 2.使用步骤: (一)高通官网申请免费key值  (二)创建database (三)创建target 特别说明,此处target分为图片,3d实体模型,以及立方 ...

  10. 电容屏物体识别_一种基于触摸屏触摸点的物体识别方法与流程

    本发明涉及触摸屏触摸点物体识别技术领域,具体为一种基于触摸屏触摸点的物体识别方法. 背景技术: 多触点触摸屏支持多个触点同时输入,通过触摸屏的点的特征,进行物体识别是一个成熟的技术,以下简称物体识别为 ...

最新文章

  1. NYOJ 5177 疯牛(最大化最小值 二分搜索)
  2. 在大规模系统中使用Scala
  3. 高性能编程:三级缓存(LLC)访问优化
  4. Spring Boot 核心知识点总结,值得收藏!
  5. 机器学习(九)初识BP神经网络
  6. pyhton学习,day1作业,用户名密码登录模块
  7. python :编写装饰器
  8. pip 安装 opencv
  9. LeetCode:旋转链表【61】
  10. DataGridView:根据条件改变单元格的颜色
  11. adobe acrobat pro字体很怪,有点发虚,不整齐,调整方法
  12. rs485数据线接反_终于有人把RS485通讯的正确接线方式讲明白了,网友:这下好办了...
  13. JupyterNotebook中更新pip以及使用pip install安装lightgbm
  14. 《现代控制工程基础》复习笔记
  15. 有关费尔防火墙一书TDI代码“网上邻居”不能访问功能的修复
  16. Allegro各属性说明如 Clines或者Cline Segs
  17. c语言写的电脑开关机代码,只需要几行代码制作电脑开关机控制软件
  18. OCR为你定义驾驶证识别(驾照识别)技术
  19. 【html5基础学习速成】
  20. 解不等式之调和级数不等式

热门文章

  1. Java数据结构与算法——哈希表
  2. 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?
  3. ACCESS数据库程序设计
  4. Android GPS学习笔记—HAL实现
  5. 软件体系结构期末复习(快速入门考试)
  6. 测量平差个人知识总结
  7. IE 浏览器旧版本下载
  8. 放大镜 讲课_《放大镜》的教学设计
  9. Linux+Ubuntu
  10. 机顶盒ttl无法输入_请教大神,机顶盒接TTL进不了uboot模式