标签:date() game res arp raw ips summary clone() static
using UnityEngine;
using System.Collections;
using OpenCvSharp;
using UnityEngine.UI;
using System.IO;
public class FaceDetection : MonoBehaviour
{
public WebCamTexture cameraTexture;//摄像头对象
public string cameraName = "";
Texture2D rt;
[Header("五官模型")]
public GameObject FacePhoto;
public GameObject EyeLeft;
public GameObject EyeRight;
public GameObject Nose;
public GameObject Mouth;
[Header("五官")]
public Texture2D FaceTexture;
public Texture2D EyeLeftTexture;
public Texture2D EyeRightTexture;
public Texture2D NoseTexture;
public Texture2D MouthTexture;
private bool isPlay = false;
static int mPreviewWidth = 320;
static int mPreviewHeight = 240;
bool state = false;
CascadeClassifier haarCascade;
WebCamDevice[] devices;//描述网络摄像头设备的结构。
Texture2D temp;
// 用于初始化
void Start()
{
rt = new Texture2D(mPreviewWidth, mPreviewHeight, TextureFormat.RGB565, false);
temp = new Texture2D(mPreviewWidth, mPreviewHeight, TextureFormat.RGB565, false);
StartCoroutine(Test());//
//CascadeClassifier级联分类器,可用来对象检测
haarCascade = new CascadeClassifier(Application.streamingAssetsPath + "/haarcascades/haarcascade_frontalface_alt.xml");//haarcascade_frontalface_alt2.xml//haarcascade_frontalface_alt.xml
}
public void StartDetectionFace()
{
this.state = true;
}
public void StopDetectionFace()
{
this.state = false;
}
// Update is called once per frame
void Update()
{
}
//开启协程,获取摄像头图像数据
IEnumerator Test()
{
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//等待用户允许访问
if (Application.HasUserAuthorization(UserAuthorization.WebCam))//如果用户允许访问,开始获取图像
{
devices = WebCamTexture.devices;//先获取设备
cameraName = devices[0].name;
Debug.Log("Camera:" + cameraName);
cameraTexture = new WebCamTexture(cameraName, mPreviewWidth, mPreviewHeight, 15);//然后获取图像
cameraTexture.Play();//开始实施获取
isPlay = true;
}
}
Mat haarResult;
byte[] bs;
//显示摄像头看到的对象
void OnGUI()
{
if (isPlay)
{
//GUI.DrawTexture(new UnityEngine.Rect(0, 0, mPreviewWidth, mPreviewHeight), cameraTexture, ScaleMode.ScaleToFit);
if (state)
{
// 人脸识别
haarResult = DetectFace(haarCascade, GetTexture2D(cameraTexture));
bs = haarResult.ToBytes(".png");
//oadImage将PNG / JPG图像字节数组加载到纹理中。
rt.LoadImage(bs);
rt.Apply();
//System.IO.File.WriteAllBytes(@"d:\temp\1.jpg", bs);
//GUI.DrawTexture(new UnityEngine.Rect(mPreviewWidth, 0, mPreviewWidth, mPreviewHeight), rt, ScaleMode.StretchToFill);
}
else
{
StopCam();
}
}
}
Mat result;
OpenCvSharp.Rect[] faces;
Mat src;
Mat gray = new Mat();
Size axes = new Size();
Point center = new Point();
/// <summary>
/// </summary>
/// <param name="cascade"></param>
/// <returns></returns>
private Mat DetectFace(CascadeClassifier cascade, Texture2D t)
{
src = Mat.FromImageData(t.EncodeToPNG(), ImreadModes.Color);// 读取图片并提取Mat中data数据
result = src.Clone();//复制图像
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);//颜色空间转换
src = null;
#region Detect Face
//检测人脸
//DetectMultiScale可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)
//DetectMultiScale函数由分类器对象(CascadeClassifier)调用
faces = cascade.DetectMultiScale(gray, 2f, 2, HaarDetectionType.DoCannyPruning, new Size(80, 80));
Debug.Log("face count:" + faces.Length);
//渲染所有检测到的人脸
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);
Debug.Log("width:" + faces[i].Width + " Height:" + faces[i].Height);
//Mat roi_gray_img = new Mat(grayMat, new OpenCVForUnity.Rect(0, 0, rects[i].x + rects[i].width, rects[i].y + rects[i].height));
//Mat roi_img = new Mat(result, new OpenCVForUnity.Rect(0, 0, rects[i].x + rects[i].width, rects[i].y + rects[i].height));
//MatOfRect eyes = new MatOfRect();
//CascadeClassifier eyecascade = new CascadeClassifier(Application.streamingAssetsPath + "/haarcascades/haarcascade_eye.xml");
//eyecascade.detectMultiScale(roi_gray_img, eyes, 1.3d, 5, 2, new Size(20, 20), new Size());
OpenCvSharp.Rect rect = new OpenCvSharp.Rect(faces[i].X, faces[i].Y, faces[i].Width, faces[i].Height);
Mat mat = new Mat(result, rect);
byte[] bytes = mat.ToBytes(".png");
Texture2D screenShot = new Texture2D((int)axes.Width, (int)axes.Height, TextureFormat.RGB24, false);
//LoadImage 加载图像,(将PNG / JPG图像字节数组加载到纹理中)
screenShot.LoadImage(bytes, false);
screenShot.Apply();
// screenShot = SetSharp(screenShot);
// string filename = @"d:\temp\Screenshot.png";
// System.IO.File.WriteAllBytes(filename, bytes);
FacePhoto.GetComponent<RawImage>().texture = screenShot;
}
#endregion
return result;
}
Texture2D GetTexture2D(WebCamTexture wct)
{
//SetPixels设置像素块 (此函数采用颜色数组并更改纹理的整个mip级别的像素颜色)
//GetPixels获取像素颜色块 (此函数返回纹理的整个mip级别的像素颜色数组)
temp.SetPixels(wct.GetPixels());
//应用
temp.Apply();
return temp;
}
public void StopCam()
{
if(cameraTexture.isPlaying)
{
cameraTexture.Stop();
isPlay = false;
state = false;
}
}
标签:date() game res arp raw ips summary clone() static
原文地址:https://www.cnblogs.com/clhxxlcj/p/10972631.html