Unity3D WebCamTexture 调用外部摄像头

Posted alps_01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D WebCamTexture 调用外部摄像头相关的知识,希望对你有一定的参考价值。

http://www.itnose.net/detail/6259004.html

 

一:Unity 中使用WebCamTexture 调用摄像头实现拍照和摄像。

 

using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime .Serialization.Formatters.Binary;
using System.Threading;

public class takePhoto : MonoBehaviour 
{
	public string deviceName;
	//接收返回的图片数据
	WebCamTexture tex;
	public Texture2D _tex;

	void OnGUI()
	{
		if (GUI.Button(new Rect(10, 20, 100, 40), "开启摄像头"))
		{
			// 调用摄像头
			StartCoroutine(start());
		}
		
		if(GUI.Button(new Rect(10,70,100,40),"捕获照片"))
		{
			//捕获照片
			tex.Pause();
			StartCoroutine(getTexture());
		}
		
		if(GUI.Button(new Rect(10,120,100,40),"再次捕获"))
		{
			//重新开始
			tex.Play();
		}
		
		if(GUI.Button(new Rect(120,20,80,40),"录像"))
		{
			//录像
			StartCoroutine(SeriousPhotoes());
		}
		
		if(GUI.Button(new Rect(10,170,100,40),"停止"))
		{
			//停止捕获镜头
			tex.Stop ();
			StopAllCoroutines();
		}
		
		if(tex!=null)
		{
			// 捕获截图大小               ?距X左屏距离   |   距Y上屏距离  
			GUI.DrawTexture(new Rect(Screen.width/2-150,Screen.height/2-190,280,200),tex); 
		}
		
	}
	
	/// <summary>
	/// 捕获窗口位置
	/// </summary>
	public IEnumerator start()
	{
		yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
		if (Application.HasUserAuthorization(UserAuthorization.WebCam))
		{
			WebCamDevice[] devices = WebCamTexture.devices;
			deviceName= devices[0].name;
			tex=new WebCamTexture(deviceName,300,300,12);
			tex.Play();
		}
	}
	
	/// <summary>
	/// 获取截图
	/// </summary>
	/// <returns>The texture.</returns>
	public IEnumerator getTexture()
	{
		yield return new WaitForEndOfFrame();
		Texture2D t=new Texture2D(400,300);
		t.ReadPixels( new Rect(Screen.width/2-200,Screen.height/2-50,360,300),0,0,false);
		//距X左的距离        距Y屏上的距离
		// t.ReadPixels(new Rect(220, 180, 200, 180), 0, 0, false);
		t.Apply();
		byte[] byt=t.EncodeToPNG();
//		File.WriteAllBytes(Application.dataPath+"/Photoes/"+Time.time+".jpg",byt);
		tex.Play();
	}
	
	/// <summary>
	/// 连续捕获照片
	/// </summary>
	/// <returns>The photoes.</returns>
	public IEnumerator SeriousPhotoes()
	{
		while (true)
		{
			yield return new WaitForEndOfFrame();
			Texture2D t = new Texture2D(400, 300, TextureFormat.RGB24, true);
			t.ReadPixels(new Rect(Screen.width/2-180,Screen.height/2-50,360,300), 0, 0, false);
			t.Apply();
			print(t);
			byte[] byt = t.EncodeToPNG();
//			File.WriteAllBytes(Application.dataPath + "/MulPhotoes/" + Time.time.ToString().Split(‘.‘)[0] + "_" + Time.time.ToString().Split(‘.‘)[1] + ".png", byt);
			Thread.Sleep(300);
		}
	}
}



 

二:Unity 中使用WebCamTexture 设置背景为摄像头画面

1在unity的场景中新建一个Quad作为背景,可以自行调节缩放和位置。

2.新建一个Material文件夹用来存放Material,在Material里新建一个Material材质,并命名为CamTex。
3.选中CamTex材质,在Inspector面板中选择shader的模式为Unlit/Texture。
4.新建C#脚本,并将其命名为WebCam,双击脚本进行编辑,添加以下代码:
using UnityEngine;
using System.Collections;
 
public class WebCam : MonoBehaviour {
 
    public string deviceName;
    WebCamTexture tex;
        // Use this for initialization
        IEnumerator Start () {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        if(Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            deviceName = devices[0].name;
            tex = new WebCamTexture(deviceName, 400, 300, 12);
            renderer.material.mainTexture = tex;
            tex.Play();
        }
    }
}


5.将CamWeb脚本和CamTex材质拖到Quad上
6.将Quad调至摄像机正对位置。
7.点击播放按钮即可调用摄像头,在quad的贴图会显示摄像头中的画面。

以上是关于Unity3D WebCamTexture 调用外部摄像头的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D绘制物体外框线条盒子

Unity3D Shader系列之描边

Unity3D中,给人物模型加了Rigidbody之后,点击开始按钮之后,就会掉出地图外?

Unity3D 调用Java,Java调用Unity3D

Unity3d bounds包围盒 和collider碰撞器区别

Unity3d和Android之间互相调用