乐奇 Rokid 开放社区
unity3D调用外接摄像头,并保持为图片
unity3D调用外接摄像头,并保持为图片
项目要求调用摄像头,并且把图像保存下来,上传到服务器。
这里有几个难点,调用摄像头是很简单的,unity已经提供好了接口,我们只需要调用就行。
问题就是怎么把图片保存下来。我们来看下代码。
这段代码就是Unity调用摄像头的方法,图片数据就保存在tex中。
下面看这段怎么使用上面的那段代码。
复制代码
保存图片是一个难点,找了半天,才发现这个方法来实现
复制代码
保存文件的路径需要自己来设置,要保存的区域大家自己可以来调。
这里有几个难点,调用摄像头是很简单的,unity已经提供好了接口,我们只需要调用就行。
问题就是怎么把图片保存下来。我们来看下代码。
复制代码
- public string deviceName;
- WebCamTexture tex;//接收返回的图片数据
- /// <summary>
- /// 实现IEnumerator接口,这里使用了一个协程,相当于多线程。
- /// 这里是调用摄像头的方法。
- /// </summary>
- /// <returns></returns>
- IEnumerator test()
- {
- 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);
- tex.Play();//开始摄像
- }
- }
这段代码就是Unity调用摄像头的方法,图片数据就保存在tex中。
下面看这段怎么使用上面的那段代码。
-
void OnGUI()
-
{
-
//开始按钮
-
if (GUI.Button(new Rect(0, 0, 100, 100), "click"))
-
{
-
//调用启动那个协程,开启摄像头
-
StartCoroutine(test());
-
}
-
//暂停
-
if(GUI.Button(new Rect(0,200,100,30),"pause"))
-
{
-
tex.Pause();
-
//这个方法就是保存图片
-
StartCoroutine(getTexture2d());
-
}
-
-
//重启开始
-
if (GUI.Button(new Rect(0, 300, 100, 30), "restart"))
-
{
-
tex.Play();
-
}
-
if (GUI.Button(new Rect(100, 0, 100, 30), "摄像"))
-
{
-
//开始摄像,摄像就是一系列的图片集合
-
StartCoroutine(getTexture2dshexiang());
-
}
-
if(tex!=null)
-
GUI.DrawTexture(new Rect(200, 200, 200, 180), tex);
- }
保存图片是一个难点,找了半天,才发现这个方法来实现
-
/// <summary>
-
/// 获取摄像头截取的图片,这里也是一个协程
-
/// </summary>
-
/// <returns></returns>
-
IEnumerator getTexture2d()
-
{
-
yield return new WaitForEndOfFrame();
-
Texture2D t = new Texture2D(200, 180);//要保存图片的大小
-
//截取的区域
-
t.ReadPixels(new Rect(200, 320, 200, 180), 0, 0, false);
-
t.Apply();
-
//把图片数据转换为byte数组
-
byte[] byt = t.EncodeToPNG();
-
//然后保存为图片
-
File.WriteAllBytes(Application.dataPath + "/shexiang/" + Time.time + ".jpg", byt);
- }
保存文件的路径需要自己来设置,要保存的区域大家自己可以来调。
更多推荐
1682
0
0
- 0
扫一扫分享内容
分享
回到
顶部
顶部


所有评论(0)