热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UnityOpencv+DlibFaceLandmarkDetector人脸识别

相比叫Opencv自带识别Dlib识别更稳定usingDlibFaceLandmarkDetector;usingDlibFaceLandmarkDetectorExample;u

相比较Opencv自带识别  Dlib识别更稳定 

using DlibFaceLandmarkDetector;
using DlibFaceLandmarkDetectorExample;
using OpenCVForUnity.CoreModule;
using OpenCVForUnity.UnityUtils;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Rect = UnityEngine.Rect;
public class WebcamHumanBeauty : MonoBehaviour
{
#region webcam params
[SerializeField, TooltipAttribute("Set the name of the device to use.")]
public string requestedDeviceName = null;
[SerializeField, TooltipAttribute("Set the width of WebCamTexture.")]
public int requestedWidth = 320;
[SerializeField, TooltipAttribute("Set the height of WebCamTexture.")]
public int requestedHeight = 240;
public RawImage WebcamHumanBeautyRaw;
private WebCamTexture webCamTexture;
private WebCamDevice webCamDevice;
#endregion
#region fps
[SerializeField, TooltipAttribute("Set FPS of WebCamTexture.")]
public int requestedFPS = 30;
private FpsMonitor fpsMonitor;
#endregion
#region dlib plugin params
private FaceLandmarkDetector faceLandmarkDetector; // dlib 实例
private string dlibShapePredictorFileName = "sp_human_face_68.dat"; // 训练模型
private string dlibShapePredictorFilePath; // 训练模型文件
private Color32[] colors;
private Texture2D texture;
private Mat webcamMat; // 摄像头 Mat
private Mat faceRectMat; // 脸部区域 Mat
public RawImage TestRaw;
private Texture2D testRawT2D;
private OpenCVForUnity.CoreModule.Rect faceRect;
#endregion
private void Start()
{
// fps 监视器
fpsMOnitor= gameObject.AddComponent();
dlibShapePredictorFilePath = Utils.getFilePath(dlibShapePredictorFileName);
Run();
//webcamMat = new Mat(texture.height, texture.width, CvType.CV_8UC4);
}
private void Update()
{
Color32[] colors = GetColors();
if (colors != null)
{
// Todo : 这个函数直接赋值texture 或者 webcameTexture
// Todo: WebcamHumanBeautyRaw.texture
faceLandmarkDetector.SetImage(colors, texture.width, texture.height, 4, true);
List detectResult = faceLandmarkDetector.Detect();
foreach (var rect in detectResult)
{
//Debug.Log("face : " + rect);
//detect landmark points
faceLandmarkDetector.DetectLandmark(rect);
//draw landmark points
faceLandmarkDetector.DrawDetectLandmarkResult(colors, texture.width, texture.height, 4, true, 0, 255, 0, 255);
}
//draw face rect
faceLandmarkDetector.DrawDetectResult(colors, texture.width, texture.height, 4, true, 255, 0, 0, 255, 2);
texture.SetPixels32(colors);
texture.Apply(false);
//if (detectResult.Count > 0)
//{
// faceRect = new OpenCVForUnity.CoreModule.Rect(0, 0, 600, 500);
// faceRect.x = Convert.ToInt32(detectResult[0].x);
// faceRect.y = Convert.ToInt32(detectResult[0].y);
// faceRect.width = Convert.ToInt32(detectResult[0].width);
// faceRect.height = Convert.ToInt32(detectResult[0].height);
// Debug.Log("face : " + faceRect);
// testRawT2D = new Texture2D(600, 500);
// //testRawT2D = new Texture2D(faceRect.width, faceRect.height);
// //faceRectMat = new Mat(webcamMat, faceRect);
// //Utils.matToTexture2D(faceRectMat, testRawT2D);
// //TestRaw.texture = testRawT2D;
// //TestRaw.SetNativeSize();
//}
//Utils.texture2DToMat(texture, webcamMat);
}
}
// 创建dlib 实例 初始化
private void Run()
{
faceLandmarkDetector = new FaceLandmarkDetector(dlibShapePredictorFilePath);
Initialize();
}
// 携程打开摄像头
private void Initialize()
{
StartCoroutine(_Initialize());
}
// 摄像头携程初始化
private IEnumerator _Initialize()
{
// Creates the camera
if (!String.IsNullOrEmpty(requestedDeviceName))
{
int requestedDeviceIndex = -1;
if (Int32.TryParse(requestedDeviceName, out requestedDeviceIndex))
{
if (requestedDeviceIndex >= 0 && requestedDeviceIndex {
webCamDevice = WebCamTexture.devices[requestedDeviceIndex];
webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, requestedFPS);
}
}
else
{
for (int cameraIndex = 0; cameraIndex {
if (WebCamTexture.devices[cameraIndex].name == requestedDeviceName)
{
webCamDevice = WebCamTexture.devices[cameraIndex];
webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, requestedFPS);
break;
}
}
}
if (webCamTexture == null)
Debug.Log("Cannot find camera device " + requestedDeviceName + ".");
}
if (webCamTexture == null)
{
if (WebCamTexture.devices.Length > 0)
{
webCamDevice = WebCamTexture.devices[0];
webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, requestedFPS);
}
else
{
Debug.LogError("Camera device does not exist.");
yield break;
}
}
//WebcamHumanBeautyRaw.texture = webCamTexture;
// Starts the camera
webCamTexture.Play();
//webCamTexture.GetPixels32 创建Color32要放在Play() 后面
//https://docs.unity3d.com/ScriptReference/WebCamTexture.GetPixels32.html
colors = new Color32[webCamTexture.width * webCamTexture.height];
texture = new Texture2D(webCamTexture.width, webCamTexture.height, TextureFormat.RGBA32, false);
WebcamHumanBeautyRaw.texture = texture;
}
// 返回摄像头像素值
private Color32[] GetColors()
{
webCamTexture.GetPixels32(colors);
return colors;
}
// 销毁释放
private void OnDestroy()
{
if (webCamTexture != null)
{
webCamTexture.Stop();
WebCamTexture.Destroy(webCamTexture);
webCamTexture = null;
}
if (faceLandmarkDetector != null)
faceLandmarkDetector.Dispose();
}
}




推荐阅读
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 作为一名CSS初学者,我在博客园中尝试通过CSS美化页面,特别是为超链接添加图标,以提升阅读体验。本文将分享如何使用CSS和字体图标库来实现这一功能。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • HTML download 属性详解及应用
    本文探讨了 HTML 中 download 属性的应用场景及其在不同浏览器中的实现方式,通过示例代码展示了如何利用 JavaScript 实现文件下载功能。 ... [详细]
  • 本文详细介绍了如何通过配置 Chrome 和 VS Code 来实现对 Vue 项目的高效调试。步骤包括启用 Chrome 的远程调试功能、安装 VS Code 插件以及正确配置 launch.json 文件。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文旨在探讨如何撰写高效且全面的工作总结,特别是针对数据库管理、Java编程及Spring框架的学习与应用。文章通过实例分析,帮助读者掌握工作总结的写作技巧,提高个人工作汇报的质量。 ... [详细]
  • 本文探讨了HTA(HTML Application)环境中HTML5 IndexedDB的可用性问题,并提供了一种替代方案,即通过使用COM ActiveX对象来实现数据存储功能。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • 字符、字符串和文本的处理之Char类型
    .NetFramework中处理字符和字符串的主要有以下这么几个类:(1)、System.Char类一基础字符串处理类(2)、System.String类一处理不可变的字符串(一经 ... [详细]
  • electronvue使用electronupdater实现自动更新
    今天呢,给大家带来一篇干货满满的electron-vue自动升级的教程,话不多说,开始我的表演!配置文件package.jsonbu ... [详细]
  • Nagios可视化插件开发指南 —— 配置详解
    本文详细介绍了Nagios监控系统的配置过程,包括数据库的选择与安装、Nagios插件的安装及配置文件的解析。同时,针对常见的配置错误提供了具体的解决方法。 ... [详细]
  • 本文介绍了JSP的基本概念、常用标签及其功能,并通过示例详细说明了如何在JSP页面中使用Java代码。 ... [详细]
  • 多用户密码验证与加密登录系统
    本文介绍了一种基于多用户密码文件的加密登录方法,通过读取用户密码文件并使用简单的加密算法实现安全登录。文中详细描述了程序的设计思路及其实现过程。 ... [详细]
author-avatar
0鞋包控0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有