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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • NumPy-读写文件「建议收藏」

    NumPy-读写文件「建议收藏」读写文件NumPy文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式(1)save函数是以二进制的格式保存数据。  格式:  np.save("./save_arr",arr1)(2)load函数是从二进制的文件中读取数据。  格式:  np.load("./save_arr.npy")(3)savez函数可以将多个数组保存到一个文件中。  …

  • 最流行的Spring Cloud微服务架构实践与经验总结

    最流行的Spring Cloud微服务架构实践与经验总结SpringCloud

  • idea2021.4激活码失效_通用破解码

    idea2021.4激活码失效_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • MFC中ASSERT_VALID fails with NULL pointer的个人解决办法[通俗易懂]

    MFC中ASSERT_VALID fails with NULL pointer的个人解决办法[通俗易懂]基于MFC在写一个利用GDAL和GDI+显示图像的系统,原有的Image::FromFile和Image::FromStream都用了一遍发现均会造成锁文件的情况,即使在程序用了delete的情况下,按道理FromStream应该不会锁但是我笨拙的编码依然是锁上了。。。索性换GDAL读图像然后用GDI+显示。在码代码中出现了如下的问题:VS2005调试输出显示:ASSERT_VALIDfai

  • 如何和女生聊天不尬聊_女孩说和我聊天是尬聊

    如何和女生聊天不尬聊_女孩说和我聊天是尬聊大家好呀,我是辣条。写这篇文章的灵感来源于之前和朋友的聊天,真的无力吐槽了,想发适合的表情包怼回去却发现收藏的表情包就那几个,就想着是不是可以爬取一些表情包,再也不用尬聊了。先给大家看看我遇到的聊天最尬的场面:斗图吧图片采集抓取目标工具使用重点内容学习项目思路分析整理需求简易源码分享抓取目标网站:斗图吧工具使用开发环境:win10、python3.7开发工具:pycharm、Chrome工具包:requests、etree重点内容学习1.Q队列储存数据信息2.py多线程使用方法

  • 公司怎么建局域网_大型局域网组建教程

    公司怎么建局域网_大型局域网组建教程什么是局域网局域网(LocalAreaNetwork,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程

发表回复

您的电子邮箱地址不会被公开。

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