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的贴图会显示摄像头中的画面。

时间: 2024-10-10 04:18:49

Unity3D WebCamTexture 调用外部摄像头的相关文章

unity3D调用外接摄像头,保存图片、不使用截屏方式

首先感谢前辈使用截屏的方式调用外接摄像头并保存图片:http://blog.csdn.net/a112634313/article/details/8472786 Texture2D处理http://www.narkii.com/club/thread-291958-1.html 不多说,直接上我的代码 using UnityEngine; using System.Collections; using System.IO; public class CameraTest : MonoBehav

Unity调用PC摄像头

转载于Unity3d圣典里面,具体哪位大侠写的我忘咯. using UnityEngine; using System.Collections; public class CameraTest : MonoBehaviour { public string deviceName; WebCamTexture tex; // Use this for initialization IEnumerator Start() { //获取授权 yield return Application.Reque

[实用工具]Unity调用外部EXE或Shell命令

版权所有,转载须注明出处!喜欢火影.喜欢Java.喜欢unity3D.喜欢游戏开发的都可以加入木叶村Q群:379076227 1.开门见山的需求有的时候,我们想把一些外部命令集成到unity中,比如,你想通过点击Unity中的一个按钮,就更新SVN(假设该项目是受SVN管理的).那么,就涉及到一个Unity调用外部可执行文件.bat/shell等.这个需求是挺常见的,也是不难实现的. 2.简单明了的实现我们先封装一个命令调用的函数: [C#] 纯文本查看 复制代码 ? 01 02 03 04 0

windows下调用外部exe程序 SHELLEXECUTEINFO

本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: 1 typedef struct _SHELLEXECUTEINFO { 2 DWORD cbSize; 3 ULONG fMask; 4 HWND hwnd; 5 LPCTSTR lpVerb; 6 LPCTSTR lpFile; 7 LPCTSTR lpParameters; 8 LPCTSTR lpD

webBrowser调用外部js文件和js函数(转载)

原文链接:http://fy5388.blog.163.com/blog/static/56499537201012594314130/ webBrowser调用外部js文件和js函数 '第一种方法:webbrowser动态调用html和js代码,都是动态的:代码示例: webBrowser1.Navigate("about:blank");webBrowser1.Document.OpenNew(True);webBrowser1.Document.Write("<H

C# ASP.NET Webservice调用外部exe无效的解决方法

最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决方法 本文参考了以下网页,十分感谢 http://bbs.csdn.net/topics/300053869 http://blog.163.com/[email protected]/blog/static/15737970200862331842368/ 环境:win7 sp1 64位 以及II

python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为

1.参考 autopy (实践见最后一章节) 用Python制作游戏外挂(上) AutoPy Introduction and Tutorial autopy.mouse.smooth_move(1, 1) 可以实现平滑移动 autopy - API Reference pip install PyUserInput SavinaRoja/PyUserInput [python3.5][PyUserInput]模拟鼠标和键盘模拟 Python-模拟鼠标键盘动作 autoit selenium借助

Perl调用外部命令的方式和区别

主要的方式简述如下:1. system("command");使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码. 2. exec("command");效果同system命令类似,区别是不会开启子进程,而是取代父进程,因此执行完引号中的命令后进程即结束.一般和fork配合使用. 3. `command`;使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值. 4. o

Matlab调用外部库函数方法和注意事项

在MATLAB环境下访问外部函数的共享库文件,必须首先把该库文件加载到内存中.一旦加载成功,就 能直接在MATLAB中直接请求关于函数的任何信息.而当不再需要该库时,就应当及时把库文件从内存 中卸载以节省内存开销. 加载库 加载库加载库 加载库 语法:loadlibrary('shrlib','hfile') 其中shrlib为加载的动态链接库文件名(filename.dll),hfile为头文件名,它包含函数原型.例如,当加载包 含MATLAB中mx程序的libmx库时,可以使用下列语句. h