上一篇《Maxmspjitter实现实时抓取摄像头画面并制成序列图 (定时抓拍)》已讲到了定时抓拍的相关问题解决方案,这一篇继续,采用不同的方法,不同的平台----基于Unity。

目标明确:相隔一定时间抓拍一张实时图片。

开始

参考了thissky博主的文章【Unity 3D之调用摄像头并存储】,设立了一个协程执行的函数,如下:

IEnumerator OpenCamera()
{
//等待用户允许访问
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
//如果用户允许访问,开始获取图像
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{
//先获取设备
WebCamDevice[] device = WebCamTexture.devices; string deviceName = device[0].name;
//然后获取图像
tex = new WebCamTexture(deviceName,1920,1080,30); //采集1920*1080分辨率、30帧速率的相机
//将获取的图像赋值
ma.material.mainTexture = tex;
rawImage.texture = tex;
//开始实施获取
tex.Play(); }
}

然后在游戏刚开始时开启这个协程任务:

StartCoroutine(OpenCamera()); //开启一个协程任务

这样得到的结果是在Unity场景中可实时获得摄像头画面。

接下来

接下来的任务是要构建保存静帧的方法,如下:

public class CameraTextureSave : MonoBehaviour
{
public static void Save(WebCamTexture t,int frame)
{
Texture2D t2d = new Texture2D(t.width, t.height, TextureFormat.ARGB32, true);
//将WebCamTexture 的像素保存到texture2D中
t2d.SetPixels(t.GetPixels());
//t2d.ReadPixels(new Rect(200,200,200,200),0,0,false);
t2d.Apply();
//编码
byte[] imageTytes = t2d.EncodeToJPG(); //存储
//File.WriteAllBytes(Application.streamingAssetsPath + "/my1/" + Time.time + ".jpg", imageTytes);
string str = string.Format("{0:D6}", frame);
File.WriteAllBytes(Application.streamingAssetsPath + "/my1/" + "image_" + str + ".jpg", imageTytes); }
}

最后

相隔时间调用截图函数,这里就以最基本的基于游戏时间累计的方法来创建计时器,触发相应操作,参考如下:

timer -= Time.deltaTime;
if (timer <= 0)
{
TakePhoto();
timer = 2.0f; //相隔两秒触发一次
}
//抓拍序列图片方法
private void TakePhoto()
{
CameraTextureSave.Save(tex,framecount);
framecount++;
print("- saved - ");
}

完整的代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI; public class CameraTest : MonoBehaviour { //摄像头图像类,继承自texture
WebCamTexture tex;
public Image WebCam;
public RawImage rawImage;
public MeshRenderer ma; public float timer = 2.0f; // 定时2秒
public int framecount = 0; //序列计数
void Start()
{
//开启协程,获取摄像头图像数据
StartCoroutine(OpenCamera());
} // Update is called once per frame
void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)
{
TakePhoto();
timer = 2.0f;
}
} private void TakePhoto()
{
CameraTextureSave.Save(tex,framecount);
framecount++;
print("- saved - ");
} IEnumerator OpenCamera()
{
//等待用户允许访问
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
//如果用户允许访问,开始获取图像
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{
//先获取设备
WebCamDevice[] device = WebCamTexture.devices; string deviceName = device[0].name;
//然后获取图像
tex = new WebCamTexture(deviceName,1920,1080,30);
//将获取的图像赋值
ma.material.mainTexture = tex;
rawImage.texture = tex;
//开始实施获取
tex.Play(); }
} public class CameraTextureSave : MonoBehaviour
{ public static void Save(WebCamTexture t,int frame)
{
Texture2D t2d = new Texture2D(t.width, t.height, TextureFormat.ARGB32, true);
//将WebCamTexture 的像素保存到texture2D中
t2d.SetPixels(t.GetPixels());
//t2d.ReadPixels(new Rect(200,200,200,200),0,0,false);
t2d.Apply();
//编码
byte[] imageTytes = t2d.EncodeToJPG(); //存储
//File.WriteAllBytes(Application.streamingAssetsPath + "/my1/" + Time.time + ".jpg", imageTytes);
string str = string.Format("{0:D6}", frame); //定义序列图片命名,如 image_#####.jpg 000001 000002
File.WriteAllBytes(Application.streamingAssetsPath + "/my1/" + "image_" + str + ".jpg", imageTytes); }
} }

Unity场景中,添加一个Cube,一个RawImage,注意将CameraTest脚本绑在任何一个GameObject上,并赋予marawimage对象,分别对应材质上显示图像和UI上显示图像,如下图:

结果

运行起来,在StreamingAssets文件夹下会产生序列图片,即为要的实时抓拍的摄像头画面。

参考文献

[1] https://www.cnblogs.com/zhuhongjongy/p/7199308.html Unity 3D之调用摄像头并存储

[2] https://blog.csdn.net/u014361280/article/details/107374795 Unity 基础 之 WebCamTexture 获取设备摄像头(包括PC和移动端),简单渲染到 UGUI 或 游戏物体上

基于Unity调取摄像头方式的定时抓拍保存图像方法小结的更多相关文章

  1. Unity打开摄像头占满全屏

    Unity打开摄像头占满全屏 AR项目需求,Unity打开摄像头作为背景渲染占满全屏~ Unity对设备硬件操作的API并不是太友好~打开一个摄像头,渲染到屏幕上也都得自己写,虽然步骤少,提取摄像头t ...

  2. react-native-image-picker 运用launchCamera直接调取摄像头的缺陷及修复

    在前几天用react-native进行android版本开发当中,用到了"react-native-image-picker"的插件:根据业务的需求:点击按钮-->直接调取摄 ...

  3. 基于opencv在摄像头ubuntu根据视频获取

     基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考h ...

  4. 基于Unity的AR开发初探:第一个AR应用程序

    记得2014年曾经写过一个Unity3D的游戏开发初探系列,收获了很多好评和鼓励,不过自那之后再也没有用过Unity,因为没有相关的需求让我能用到.目前公司有一个App开发的需求,想要融合一下AR到A ...

  5. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  6. 基于Unity的A星寻路算法(绝对简单完整版本)

    前言 在上一篇文章,介绍了网格地图的实现方式,基于该文章,我们来实现一个A星寻路的算法,最终实现的效果为: 项目源码已上传Github:AStarNavigate 在阅读本篇文章,如果你对于里面提到的 ...

  7. Vuforia unity开发摄像头问题

    Vuforia unity开发摄像头问题 项目一直在赶进度,写博的时间越来越少了~从事Unity开发也快两个月了,AR方向~ 使用的是高通家的SDK Vuforia...从工程融合一直到对unity和 ...

  8. HoloLens开发手记 - Unity之摄像头篇

    当你穿戴好HoloLens后,你就会处在全息应用世界的中心.当你的项目开启了"Virtual Reality Support"选项并选中了"Windows Hologra ...

  9. Spring中Bean的配置:基于XML文件的方式

    Bean的配置一共有两种方式:一种是基于XML文件的方式,另一种是基于注解的方式.本文主要介绍基于XML文件的方式 <bean id="helloWorld" class=& ...

  10. struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)

    课时22 基于XML配置方式实现对action的所有方法进行校验   使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...

随机推荐

  1. 【Android】屏幕超时休眠

    前言 屏幕超时休眠指的是在设备一段时间没有操作后,自动关闭屏幕显示以节省电量并防止误触.当屏幕进入休眠状态时,通常会关闭屏幕背光,但设备可能仍在运行后台进程. 正文 Settings应用相关 Sett ...

  2. Gitlab的备份与恢复,异机转移

    ​注意:异机转移的时候,gitlab的版本必须一致. 一.备份GitLab数据 停止GitLab服务 gitlab-ctl stop unicorn gitlab-ctl stop sidekiq 创 ...

  3. Shiro配置跳过权限验证

    需求 因为在开发环境,测试环境,有时候需要跳过shiro的权限验证.所以想写个简单的配置跳过shiro的权限验证.跳过权限验证的原理就是重写**@RequiresPermissions**的实现,然后 ...

  4. 网页转换成电脑exe软件简单办法

    准备windows电脑,其他电脑步骤差不多 1.安装nodejs(nodejs自带npm),前往nodejs官网下载,选择Windows 安装包 (.msi) 64位,一直点击下一步安装即可 2.wi ...

  5. Qt编写安防视频监控系统21-摄像机管理

    一.前言 摄像机管理在整个系统中是数据库部分最核心的,只有添加了摄像机信息,才能进行加载,生成树状列表等,摄像机表信息的字段内容改过好几次,有可能后期还需要修改,目前摄像机表信息主要包括摄像机编号.摄 ...

  6. Qt音视频开发20-海康sdk本地播放

    一.前言 海康sdk中包含了MP4解码播放库,对应的API函数都是PlayM4开头的,顾名思义播放MP4,海康的视频默认可以保存成MP4文件,可以用通用的播放器来播放,这就是为啥前面好多篇文章讲到的各 ...

  7. Vue中this.$store.dispatch() 与 this.$store.commit()的区别

    两者的区别 (1)this.$store.commit() commit: 同步操作 this.$store.commit('方法名',值)[存储] this.$store.state.方法名[取值] ...

  8. [转]在WorldWind中加入*.x格式的三维模型

    Nasa支持的WorldWind项目最近推出了1.4RC5版,可以加入三维模型,效果如下图所示: 点击查看大图 WW1.4对XML配置文件增加了许多新的元素,其中ModelFeature就是用来增加三 ...

  9. 阿里云IP遭受DDOS攻击 快速切换IP实践

    阿里云IP遭受DDOS攻击 快速切换IP实践 #1 介绍 运行平台: 阿里云 访问链路: 域名 -> 负载均衡EIP -> 容器 网站无法访问,查询服务运行正常,查询公网流量异常高后断流了 ...

  10. 画(HB To Ryby!)

      "客人,请描述得具体一点."   他似乎还是很难为情.   "呃--就是--一个女孩儿",他又勉强启开嘴,"女孩儿"三个字几乎被咽进嗓子 ...