当前位置: 首页 > 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文件…...

终极B站视频下载指南:BilibiliDown一键解锁高清视频下载

终极B站视频下载指南&#xff1a;BilibiliDown一键解锁高清视频下载 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors…...

Jetson Nano到手第一步:保姆级系统烧录与基础环境配置(避坑指南)

Jetson Nano开箱实战&#xff1a;从零构建AI开发环境的完整指南 刚拆封的Jetson Nano开发板躺在桌面上&#xff0c;这块仅有信用卡大小的设备却蕴含着强大的边缘计算能力。对于初次接触嵌入式AI开发的工程师而言&#xff0c;如何正确完成系统初始化往往成为第一个技术门槛。本文…...

CodMate:基于上下文感知的智能代码伴侣设计与实践

1. 项目概述&#xff1a;一个为开发者量身定制的代码伴侣如果你和我一样&#xff0c;每天大部分时间都在和代码编辑器、终端以及各种文档打交道&#xff0c;那你一定对“效率”这个词有很深的执念。我们总是在寻找能让自己写代码更快、调试更准、理解项目更轻松的工具。今天要聊…...

Chrome for Testing:如何用3个核心策略解决Web自动化测试的版本管理困境

Chrome for Testing&#xff1a;如何用3个核心策略解决Web自动化测试的版本管理困境 【免费下载链接】chrome-for-testing 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-for-testing 在Web自动化测试领域&#xff0c;版本兼容性问题每年导致企业损失数千小时的…...

【2024最新】ChatGPT联网搜索避坑白皮书:已踩过137次坑的技术总监总结出的6条铁律

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ChatGPT联网搜索功能的核心机制与能力边界 ChatGPT 的联网搜索功能并非内置实时浏览器&#xff0c;而是通过插件&#xff08;如 Bing Search Plugin&#xff09;或企业级 API 集成方式&#xff0c;在用…...

从basicfwd到自定义发包器:手把手教你用DPDK 21.11写一个高性能发包程序

从basicfwd到自定义发包器&#xff1a;DPDK 21.11高性能网络编程实战 在当今云计算和边缘计算蓬勃发展的时代&#xff0c;网络性能优化已成为开发者必须面对的挑战。DPDK&#xff08;Data Plane Development Kit&#xff09;作为高性能数据包处理框架&#xff0c;正在被越来越多…...

Midscene.js视觉驱动自动化测试终极教程:跨平台AI测试实战深度解析

Midscene.js视觉驱动自动化测试终极教程&#xff1a;跨平台AI测试实战深度解析 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 还在为多设备、多平台测试的碎片化…...

CursorTouch/Operator-Use:融合光标与触摸的交互范式设计与实现

1. 项目概述&#xff1a;从“CursorTouch”到“Operator-Use”的交互范式演进最近在琢磨一个挺有意思的交互设计项目&#xff0c;我把它暂命名为“CursorTouch/Operator-Use”。这个名字听起来有点技术范儿&#xff0c;但核心想解决的问题其实很接地气&#xff1a;我们如何让电…...

如何快速掌握Spinning Up超参数调优:提升深度强化学习性能的终极指南

如何快速掌握Spinning Up超参数调优&#xff1a;提升深度强化学习性能的终极指南 【免费下载链接】spinningup An educational resource to help anyone learn deep reinforcement learning. 项目地址: https://gitcode.com/gh_mirrors/sp/spinningup Spinning Up是一款…...

Doris 进阶指南:从小项目到生产级系统的完整路径

一、前言Doris 进阶指南&#xff1a;从小项目到生产级系统的完整路径。本文深入源码层面&#xff0c;剖析核心设计原理&#xff0c;帮你从"会用"升级到"精通"。二、核心原理深度剖析2.1 数据结构设计// Doris 核心数据结构与算法 // 理解 Doris 的底层数据…...