当前位置: 首页 > news >正文

Unity OpenCVForUnity 安装和第二个案例详解 <二>

目录

一、前言

二、场景介绍

1.WebCamTextureToMatExample脚本

2.FpsMonitor脚本

三、 结构体Scaler

四、找到相机并使用

1.相机的启用

2.格式转换

a.把webCamTexture转换成Mat

b.把Mat转换成Texture2D

五、脚本组合

六、作者的碎碎念


一、前言

第二个案例(如图1所示),讲的内容是使用相机和把相机的图片转换成Mat再去使用。

图1 案例2

二、场景介绍

这个案例,如果你点击运行了,就是把相机的内容显示在界面里,同时你可以控制相机的切换,是否启动。

整个场景中,重要的脚本有两个。(如图2所示)

图2 两个重要的脚本
1.WebCamTextureToMatExample脚本

 这个脚本主要是控制相机的启停,输出图片,把图片显示在界面上。

2.FpsMonitor脚本

这个脚本是帧率监视器,把图片的长宽,和输出图片的帧率显示在界面上。(如图3所示)

这些数字和方框都是在脚本里画的,所以在界面里看不见这个游戏物体。

图3 面板

本篇文章不讲脚本2,因为不是主要脚本,只讲脚本1.

三、 结构体Scaler

图片计算一般是四个数据。比如,Color是(255,255,255,255)。

但是我们每次设置就要new Color(255,255,255,255),再进行修改或者计算是比较麻烦的。

为了不那么麻烦,OpenCV中设置了一个结构体Scaler,专门用来存放四个数,可以复制,可以相乘等,写了一些帮助计算的代码。本质就是存放四个数的结构体

大家后面看见了不要太陌生。

四、找到相机并使用

我把WebCamTextureToMatExample脚本中最核心的部分拿了出来,单独写了一个脚本。

1.相机的启用
//相机驱动
WebCamDevice webCamDevice;
//相机拍摄的图片
WebCamTexture webCamTexture;//你希望输出的分辨率宽
public int requestedWidth = 1920;
//你希望输出的分辨率高
public int requestedHight = 1080;
//相机按什么帧率输出图片
public int requestFPS = 30;void Start()
{//初始化Initialize();
}//相机的初始化用携程比较好,就再创建个携程调用
private void Initialize()
{ StartCoroutine(_Initialize());
}//携程
IEnumerator _Initialize()
{//获取所有可以传输图片的相机WebCamDevice[] webCamDevices = WebCamTexture.devices;//如果这个数量是大于1的if (webCamDevices.Length >= 0){ //默认取第一个相机,这里你也可以选别的,不要紧webCamDevice = webCamDevices[0];//初始化一下图片,提供驱动名称,图片的宽高,输出图片的帧率webCamTexture = new WebCamTexture(webCamDevice.name,    requestedWidth,requestedHight,requestFPS);}//如果没初始化,说明没找到相机if (webCamTexture == null){Debug.Log("没有找到相机");//跳出方法yield break;}//如果找到了,就开始接收图片webCamTexture.Play();//相机照到以后OnInited();   }

这部分代码就可以把相机打开,并且把图片拿到WebCamTexture中了。

2.格式转换

还是老规矩,万物都要转换成OpenCV的通用格式Mat,所以分两步:

a.把webCamTexture转换成Mat

b.把mat转换成Texture2D。

a.把webCamTexture转换成Mat

需要的参数有三个:

public static void webCamTextureToMat(
WebCamTexture webCamTexture, 
Mat mat, 
Color32[] pixels32Buffer, 
bool flipAfter = true, 
int flipCode = 0)

webCamTexture有了

新建Mat:

Mat rgbaMat;rgbaMat = new Mat(
webCamTexture.height, 
webCamTexture.width, 
CvType.CV_8UC4, 
new Scalar(0, 0, 0, 255));    //初始化一个黑色

新建Color32[]:

它的大小必须装得下你想要的相机图片大小。

Color32[] colors;colors = new Color32[webCamTexture.width * webCamTexture.height];

webCamTexture转换成Mat:

上一集说过,转换的方法都放在Utils类里面,所以,转换方法为:

Utils.webCamTextureToMat(webCamTexture, rgbaMat, colors);
b.把Mat转换成Texture2D

上节课的内容,这里略过。

五、脚本组合

WebCamDevice webCamDevice;WebCamTexture webCamTexture;public int requestedWidth = 1920;public int requestedHight = 1080;public int requestFPS = 30;Mat rgbaMat;Color32[] colors;Texture2D texture;void Start(){Initialize();}private void Initialize(){ StartCoroutine(_Initialize());}IEnumerator _Initialize(){WebCamDevice[] webCamDevices = WebCamTexture.devices;if (webCamDevices.Length >= 0){ webCamDevice = webCamDevices[0];webCamTexture = new WebCamTexture(webCamDevice.name,requestedWidth,requestedHight,requestFPS);}if (webCamTexture == null){Debug.Log("没有找到相机");yield break;}webCamTexture.Play();OnInited();}private void OnInited(){//初始化Colorscolors = new Color32[webCamTexture.width * webCamTexture.height];//初始化texturetexture = new Texture2D(webCamTexture.width, webCamTexture.height, TextureFormat.RGBA32, false);//初始化mat并赋值黑色rgbaMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC4, new Scalar(0, 0, 0, 255));//转换Utils.matToTexture2D(rgbaMat, texture, colors);//我是把脚本挂在RawImage上的,所以可以直接赋值gameObject.GetComponent<RawImage>().texture = texture;}void Update(){if (webCamTexture.isPlaying && webCamTexture.didUpdateThisFrame){Utils.webCamTextureToMat(webCamTexture, rgbaMat, colors);Utils.matToTexture2D(rgbaMat, texture, colors);//我是把脚本挂在RawImage上的,所以可以直接赋值gameObject.GetComponent<RawImage>().texture = webCamTexture;}}

六、作者的碎碎念

发现数据还挺好,所以....继续更了。

相关文章:

Unity OpenCVForUnity 安装和第二个案例详解 <二>

目录 一、前言 二、场景介绍 1.WebCamTextureToMatExample脚本 2.FpsMonitor脚本 三、 结构体Scaler 四、找到相机并使用 1.相机的启用 2.格式转换 a.把webCamTexture转换成Mat b.把Mat转换成Texture2D 五、脚本组合 六、作者的碎碎念 一、前言 第二个案例&#xf…...

Lua实现自定义函数面向对象编程

本文目录 1、引言2、原理3、实例4、层析验证 文章对应视频教程&#xff1a; 暂无&#xff0c;可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在现代软件开发中&#xff0c;面向对象编程&#xff08;OOP&#xff09;已经成为一种广泛使用的编程范式…...

docker安装消息队列mq中的rabbit服务

在现代化的分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;已经成为了一种不可或缺的组件。RabbitMQ作为一款高性能、开源的消息队列软件&#xff0c;因其高可用性、可扩展性和易用性而广受欢迎。本文将详细介绍如何在Docker环境中安装RabbitMQ服务…...

OpenAI新模型发布,免费开放GPT-4o!但只开放一点点...

GPT-4o 中的“o”代表“omni”——指的是 GPT-4o 的多模态。 该模型将向免费客户开放&#xff0c;这意味着任何人都可以通过 ChatGPT 访问 OpenAI 最先进的技术。 GPT-4o 是 OpenAI 昨天晚上发布的新旗舰模型&#xff0c;可以实时推理音频、视觉和文本。 据官方介绍&#xff0…...

idea的右边栏maven不见了(丢了)解决方案以及idea无法识别maven项目

前言 众所周知&#xff0c;idea是java开发中不可缺少的利器&#xff0c;但是由于功能过多&#xff0c;导致奇怪的问题也很多 问题汇总 idea的右边栏maven丢了 idea无法识别maven项目 对应的解决办法 idea的右边栏maven丢了 原因可能是被自己手动移除了 或者 项目没被正确…...

等待 chrome.storage.local.get() 完成

chrome.storage.local.get() 获取存储处理并计数&#xff0c;内部计数正常&#xff0c;外部使用始终为0&#xff0c;百思不得其解。 如何在继续执行之前等待异步chrome.storage.local.get()完成-腾讯云开发者社区-腾讯云 (tencent.com) 原来我忽略了异步问题&#xff0c;最简…...

004 AOP使用

文章目录 基于AspectJ的AOP的使用添加依赖编写目标类和目标方法使用XML实现实现步骤切入点表达式通知类型 使用注解实现实现步骤环绕通知注解配置定义通用切入点 纯注解方式 基于AspectJ的AOP的使用 其实就是指的SpringAspectJ整合&#xff0c;不过Spring已经将AspectJ收录到自…...

Zookeeper 集群广播事务性能如何保证?

Zookeeper 集群广播事务性能如何保证? zookeeper是如何保证广播事务时,从开始到多数节点确认事务这个高效的? 在 Zookeeper 中,确保广播事务从开始到多数节点确认的高效性至关重要。Zookeeper 通过以下几个关键机制 和优化策略来实现这一目标: ZAB 协议(Zookeeper Atom…...

【vue解决el-input组件自动填充用户名密码】

解决el-input组件自动填充用户名密码 发现用autocomplete"off"并不能解决el-input组件自动填充密码的问题。 解决方法 auto-complete"new-password" 在el-input组件添加auto-complete"new-password" 即可...

案例练习:演讲比赛

演讲比赛: 比赛规则&#xff1a; 某市举行一场演讲比赛&#xff08; speech_contest &#xff09;&#xff0c;共有 24 个人参加。比赛共三轮&#xff0c;前两轮为淘汰赛&#xff0c;第三轮为决赛。 比赛方式&#xff1a;分组比赛&#xff0c;每组 6 个人&#xff1b;选手每次…...

推荐一个很好用的Latex写代码的软件

软件名称&#xff1a;Axmath 据说是国产软件&#xff0c;好用是真好用&#xff08;去哪找&#xff1f;比如某地球号的公主号或其他地方&#xff09;我是推荐付费购买使用 1.通过图形操作&#xff0c;选择要转成Latex代码的符号&#xff0c;按下转换&#xff0c;直接就出现了我…...

windows 程序右键管理员点击无响应

Windows 程序在右键单击以管理员身份运行时没有响应&#xff0c;可能是由于多种原因引起的。下面是一些常见的问题和解决方案&#xff1a; 1. 用户账户控制 (UAC) 设置问题&#xff1a; - 试着降低或提高 UAC 设置&#xff0c;然后再试一次。可以在控制面板的“用户账户”部…...

开发基于Java语言的SaaS(Software-as-a-Service,软件即服务)模式的HIS系统详解 HIS系统源码 支持二开

开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS系统详解 HIS系统源码 支持二开 开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS&#xff08;Hospital Informat…...

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…...

Activity中Context

Activity中Context在activity.attach()设置&#xff0c;所以Application中Context为ContextImpl appContext createBaseContextForActivity(r);&#xff0c;即在ContextImpl.createActivityContext()设置DispalyId private ContextImpl createBaseContextForActivity(Activit…...

位图法-有效的数独

有效的数独&#xff0c;主要是判断每行每列每宫有无重复元素。 每行每列用二重循环&#xff0c;每宫比较复杂&#xff0c;需要考虑每一宫的坐标与二重循环ij对应关系 行i&#xff0c;每一宫3行&#xff0c;3列 x3*(i/3)j/3 y3*(i%3)j%3...

Zookeeper ZNode 数据结构原理

ZNode 学习指南 1. ZNode 基本概念 什么是 ZNode:ZNode 是 Zookeeper 中的数据节点。它类似于文件系统中的文件和目录,ZNode 既可以保存数据又可以作为其他 ZNode 的父节点。ZNode 的路径:每个 ZNode 在 Zookeeper 命名空间中都有一个唯一的路径,如 /app1/config。2. ZNod…...

Golang - 90天从新手到大师

开篇 最近有很多小伙伴都在寻找go语言完整学习资料&#xff0c;我整理了一些Golang方面的知识&#xff0c;方便大家学习。内容从最基础的入门到项目设计&#xff0c;希望帮助更多想了解和学习Go语言的伙伴。 因为是持续创作&#xff0c;所以也会持续更新。有些章节目录还没有…...

MyBatis常用转义字符 大于、小于、大于等于、小于等

在Mybatis编写特殊常用字符你会发现会报错,比如常用的<,>,<,> 等&#xff0c;原因是与xml文件的元素<>冲突&#xff0c;所以需要转义。整理转义字符如下&#xff1a; 符号原始字符转义字符大于>>大于等于>>小于<<小于等于<<和&…...

Python --- 如何修改Jupyter Notebook在本地保存文件的默认路径?

如何修改Jupyter Notebook在本地保存文件的默认路径&#xff1f; 一直以来都比较喜欢jupter notebook&#xff0c;自从用了以后就爱上了。平时用的时候&#xff0c;因为大多都是临时调用&#xff0c;每次在界面里直接new一个新的file就开干。 曾经也想过我创建的这些python文件…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...