Unity+OpenCV 人脸识别追踪

Unity+OpenCV 人脸识别追踪项目需要一个人脸识别追踪的效果,所以查找了一些资料,自己做了一个功能,基本效果已经实现了。首先项目需要OpenCV的开发环境,所以首先一定要在开发电脑上装上OpenCV的开发环境,流程很简单,直接去http://opencv.org/downloads.html官网下载OpenCV的安装文件就可以了,然后配置电脑的环境变量。我的电脑是windows操作系统配置好就是这个样子,然后要把用到的

大家好,又见面了,我是你们的朋友全栈君。

项目需要一个人脸识别追踪的效果,所以查找了一些资料,自己做了一个功能,基本效果已经实现了。

首先项目需要OpenCV的开发环境,所以首先一定要在开发电脑上装上OpenCV的开发环境,流程很简单,直接去http://opencv.org/downloads.html官网下载OpenCV的安装文件就可以了,然后配置电脑的环境变量。我的电脑是windows操作系统Unity+OpenCV 人脸识别追踪

配置好就是这个样子,然后要把用到的dll文件导入进unity工程中,然后下面附上主要代码

using UnityEngine;
using System.Collections;
using OpenCvSharp;

public class VideoTest : MonoBehaviour
{
    private Camera _camera;
    public GameObject Slice;
    Material m_material;
    public GameObject m_Cube;
    public WebCamTexture cameraTexture;
    Texture2D rt;
    private string cameraName = "";
    private bool isPlay = true;
    static int mPreviewWidth = 320;//(这个分辨率可以自己调,分辨率越高越卡,我的电脑这个就刚刚好)
    static int mPreviewHeight = 240;
    bool state = true;
    CascadeClassifier haarCascade;
    WebCamDevice[] devices;
    // Use this for initialization
    void Start()
    {
        m_material = Slice.GetComponent<MeshRenderer>().material;
        rt = new Texture2D(mPreviewWidth, mPreviewHeight, TextureFormat.RGB565, false);
        temp = new Texture2D(mPreviewWidth, mPreviewHeight, TextureFormat.RGB565, false);
        StartCoroutine(Test());
        haarCascade = new CascadeClassifier(Application.streamingAssetsPath + "/haarcascades/haarcascade_frontalface_alt2.xml");
        _camera = Camera.main;
    }

    // Update is called once per frame
    float timer;
    void Update()
    {
        timer += Time.deltaTime;
        if(cameraTexture!=null)
        {
            haarResult = DetectFace(haarCascade, GetTexture2D(cameraTexture));
            bs = haarResult.ToBytes(".png");
            rt.LoadImage(bs);
            rt.Apply();
            m_material.mainTexture = rt;
            //这里的面部跟随坐标计算是我根据分辨率自己算的(不精确),当然肯定有更好的算法实现。
            m_Cube.transform.localPosition = Vector3.Slerp(m_Cube.transform.localPosition, new Vector3(center.X / 16, -center.Y / 21.8f, 0), 0.3f);
        }
    }

    IEnumerator Test()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//调用外部摄像头
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            devices = WebCamTexture.devices;
            cameraName = devices[0].name;
            cameraTexture = new WebCamTexture(cameraName, mPreviewWidth, mPreviewHeight, 30);
            cameraTexture.Play();
            isPlay = true;
        }
    }
    Mat haarResult;
    byte[] bs;
  

    Mat result;
    OpenCvSharp.Rect[] faces;
    Mat src;
    Mat gray = new Mat();
    Size axes = new Size();
    Point center = new Point();

    private Mat DetectFace(CascadeClassifier cascade, Texture2D t)
    {
        src = Mat.FromImageData(t.EncodeToPNG(), ImreadModes.Color);
        result = src.Clone();
        Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
        src = null;
        // Detect faces
        faces = cascade.DetectMultiScale(gray, 1.08, 2, HaarDetectionType.ScaleImage, new Size(30, 30));

        // Render all detected faces
        for (int i = 0; i < faces.Length; i++)
        {
            center.X = (int)(faces[i].X + faces[i].Width * 0.5);
            center.Y = (int)(faces[i].Y + faces[i].Height * 0.5);
            axes.Width = (int)(faces[i].Width * 0.5);
            axes.Height = (int)(faces[i].Height * 0.5);
            //Cv2.Ellipse(result, center, axes, 0, 0, 360, new Scalar(255, 0, 255), 4);//绘制脸部范围
        }
        return result;
    }
    Texture2D temp;
    Texture2D GetTexture2D(WebCamTexture wct)
    {
        temp.SetPixels(wct.GetPixels());
        temp.Apply();
        return temp;
    }
}

unity演示工程地址 http://download.csdn.net/detail/truck_truck/9816238

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139500.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月29日 下午6:36
下一篇 2022年5月29日 下午6:36


相关推荐

  • jenkins allure_jenkins api 文档

    jenkins allure_jenkins api 文档前言jenkins集成了allure插件,安装插件后运行pytest+allure的脚本即可在jenkins上查看allure报告了。allure安装在运行代码的服务器本机,我这里是用的dock

    2022年7月28日
    9
  • latex调整itemize的间距大小

    latex调整itemize的间距大小参考 Latex 调整 item 间距问题 默认情况下 itemize 的各项间的间距较大 占用文章空间较多 那么如何调整呢 方法 1 单独设置每个 itemize 的间距 begin itemize setlength itemsep 0pt setlength parsep 0pt setlength parskip 0pt item item en

    2026年3月18日
    2
  • c++和java哪个好学_选 Python 还是 Java ?[通俗易懂]

    c++和java哪个好学_选 Python 还是 Java ?[通俗易懂]对于在校学生,以及要转行学编程的,把一门语言熟悉起来,非常的重要。对于初学编程,以及想要转行到编程领域的人来说,总有这么一个选择,选C++、Python、还是Java好呢?哪个前景更好、哪个好学、哪个好找工作,等等这类问题。熟悉我的都知道,我是从LinuxC/C++后台开发,转行到算法工程师,在大四实习的时候,做过Go开发,大四下做毕设的时候,用过Java、以及前端一些技术;相对…

    2022年7月7日
    30
  • @Valid注解_@validated注解

    @Valid注解_@validated注解@Valid注解通常用于对象属性字段的规则检测,具体啥意思,下面让我娓娓道来:下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出@Valid注解用法详解。那么,首先,我们会有一个员工对象Employee,如下:/***员工对象**@authorsunnyzyq*@since2019/12/13*/publiccl…

    2026年4月17日
    6
  • linux权限777什么意思,chmod 权限777是什么意思

    linux权限777什么意思,chmod 权限777是什么意思chmod 权限 777 是什么意思在 Unix 和 Linux 的各种操作系统下 每个文件 文件夹也被看作是文件 都按读 写 运行设定权限 例如我用 llboa 命令列文件表时 得到如下输出 rwx xr x1rootroot 3117 20boa 从第二个字符起 rwxr 是说用户 root 具有读 写和运行权 接着的 xr 表示用户组 root 注意 在此 笔者用的是超级用户 roo

    2026年3月26日
    1
  • Hadoop集群安装HTTPS服务

    Hadoop集群安装HTTPS服务安装说明 我是自己搭建的三台虚拟机 hadoop01 hadoop02 hadoop03 生成 CA 证书 hdfs ca key 和 hdfs ca cert 只需要在任意一台节点上完成即可 其他每个节点包括生成证书的节点都需要执行第四步以后的操作 且必须使用 root 用户执行以下操作 1 在 hadoop01 节点生成 CA 证书 需要输入两次密码 其中 CN 中国简称 ST 省份 L 城市 O 和 OU 公司或个人域

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号