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

目录

一、资源简介

二、安装使用 

1.下载案例Demo 

2.移动StreamingAssets文件夹

3.添加场景 

三、今日案例 

1.案例Texture2DToMat Example

2.什么是Mat?

3.如何把Texture2D变成Mat

(1).初始化Mat

(2).Cv_8UC4注解

首先看数据大小:

然后看数据种类:

最后看通道:

(3).最终转换

四、Utils类

五、Mat转Texture2D

六、作者的碎碎念


一、资源简介

这是一款插件,在Unity商店里,卖挺贵,但是,在某宝,就比较便宜了。正版插件(如图1所示)

它还有一个免费版,但是up都是讲的下图版本。。。有条件的宝可以去官方支持一下。

图1 OpenCV完整版

二、安装使用 

正常安装后,会出现(如图2所示)

图2 安装窗口
1.下载案例Demo 

点开OpenExampleAssetsDownloader按钮,出现(如图3所示),图4为图3的翻译。

图3 案例窗口
图4 案例窗口翻译

在这个窗口中,可以下载你想要的案例。

2.移动StreamingAssets文件夹

下载完案例后,案例中的外配文件都在OpenCVForUnity文件夹里(如图5所示),我们需要把它移动到真正的StreamingAssets中。

图5 StreamingAssets文件夹

重新打开开始的插件窗口。(如图6所示)

图6 再次打开插件窗口

点击 MoveStreamingAssetsFolder按钮,这个就是专门写好帮你移动文件的按钮。(如图7所示)

图7 MoveStreamingAssetsFolder按钮

之后,它就移动到(如图8所示)里面了。

图8 StreamingAssets文件夹
3.添加场景 

案例场景有很多,但是你的场景中还是空的。(如图9所示)这个界面可能你看着不太熟悉,主要因为我用的Unity6.0,我也没用习惯呢~但这就是打包界面哈。

图9 打包界面

这时候,刚才的插件窗口里,还有一个帮我们添加场景的按钮。(如图10所示)

图10 插件窗口

然后,你的场景就满了(如图11所示),这时候,你就能正常查看案例场景了。 

图11 打包界面

三、今日案例 

我们先进入到案例主场景。(如图12所示)

图12 资源列表
1.案例Texture2DToMat Example
图13 Texture2DToMat Example

 

 这个案例如名称所示,就是如何把Texture2D变成Mat

2.什么是Mat?

众所周知,OpenCV中的核心就是对图像的处理,所有识别功能都是依赖于这个做的。但是,在计算机中,图片的本质实际上就是数据。

于是,OpenCV建立了一个类,Mat,专门储存图像的每一个像素点的信息,是一个矩阵,因为是数据,所以它在插件里是通用的,谁都可以调用,因为是数据,所以可以直接处理。

这样,在整个插件里,极大的方便了图像的处理。

因此,我们学习OpenCV的第一步,就是学习如何把Texture2D转换成Mat。

3.如何把Texture2D变成Mat
(1).初始化Mat
    //拖进来一个texturepublic Texture2D texture;void Start(){//初始化Mat,这是一个        //矩阵的行数    //矩阵的列  //看下文注解Mat imgMat = new Mat(texture.height,texture.width,CvType.CV_8UC4);}

(2).Cv_8UC4注解

这里唯一少见的是CvType.CV_8UC4,CvType是一个类,在这里主要代表的图片需要储存哪些数据,存多大

首先看数据大小:

CvType.CV_8UC4中的8代表8bite,数据一共能存8bite。

同理可得,如果是CvType.CV_16UC4,就能存16bite。

当然,还有32和64。

总结:图片又大又精细,你就选大点,反之选小一点。

然后看数据种类:

 CvType.CV_8UC4中的U代表没有正负号的整数

  • U : unsigned int , 无符号整形(没有正负号的整数)
  • S : signed int , 有符号整形(可以存正整数,也可以存负整数)
  • F : float , 单精度浮点型,float类型本身即有符号(能存正的float,也可以存负float)

总结:大部分情况如果你对图片不打算进行什么计算,用U就可以了。

如果你想上手对图片干点什么,如果图像数据需要携带额外的信息,例如颜色强度的负调整,就要用S了,因为有负数。

如果你要做一些视觉处理,对图片精度要求很高,那就用F

超级总结:初学者目前都用U

最后看通道:

CvType.CV_8UC4中的C4代表channel4,有四个通道

  • C1 只有一个通道,显示的样子是灰度图;(只有一个显示颜色的数据,颜色深一点就是黑的,颜色浅一点就是白的,所以是灰度图)
  • C2 两个通道,这个平时我们不用来看,但是图像计算的时候会用到,相当于多出来一个矩阵
  • C3 三个通道RGB,彩色图,不能透明的图,这个常见,就不讲了
  • C4 四个通道RGBA ,可以透明的图,这个常见,就不讲了

(3).最终转换
    //拖进来一个texturepublic Texture2D texture;void Start(){//初始化Mat,这是一个        //矩阵的行数    //矩阵的列  //看下文注解Mat imgMat = new Mat(texture.height,texture.width,CvType.CV_8UC4);//把Texture2D转换成矩阵,放到Mat里Utils.texture2DToMat(texture,imgMat);}

四、Utils类

在上面的最终转换中,我们用了Utils类。

这是一个非常常见的名字,很多插件都会把一些常用的工具封装到这个名字的类里。属于一种通用习惯。

在OpenCV中,Utils类可以让你调用Texture2D转换成Mat的方法,但实际上,如果一层一层翻下去,最后调用的其实是opencvforunity.dll中的方法。(如图14所示)

图14 opencvforunity.dll

总结:你是看不到具体如何转换成Mat的过程的,你只能调用人家的方法。

最后一层代码为(如果好奇的话),可以不看的,看不懂没关系的

五、Mat转Texture2D

上面讲完如何把Texture2D转换成Mat,那如果我们现在有一个Mat,如何转换成Texture2D进行使用呢?

    //拖进来一个texturepublic Texture2D texture;void Start(){//初始化Mat,这是一个        //矩阵的行数    //矩阵的列  //看下文注解Mat imgMat = new Mat(texture.height,texture.width,CvType.CV_8UC4);//把Texture2D转换成矩阵,放到Mat里Utils.texture2DToMat(texture,imgMat);//**************新内容***************************//我们这里把刚imgMat转换回去//先新建一个Texture2D用来接收Texture2D newTexture = new Texture2D(imgMat.cols(),          //imgMat的列,就是图片的宽imgMat.rows(),          //imgMat的行数,就是图片的高 TextureFormat.ARGB32,   //图片的格式是4通道RGBA //数据大小是32位false);                 //不需要压缩图//开始把imgMat的数据转换好,放到Texture2D中Utils.matToTexture2D(imgMat,newTexture);}

六、作者的碎碎念

到这里,第一个案例就讲完了,大家还想看其他的吗?如果评论区有一个活人评论,那我就继续写,如果没有,作者就去写点别的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/355247.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【React Native】measureInWindow在安卓上无法正确获取View在屏幕上的布局信息

问题描述: 在React Native中,我们可以使用measureInWindow的方式去获取一个View在屏幕中的位置信息: 下面这个Demo中,我们写了一个页面HomePage和一个列表项组件ListItemA,我们期望每过5s监测一次列表中每一项在屏幕中…

RabbitMQ(六)仲裁队列、流式队列、异地容灾(联邦队列Federation Queue)

文章目录 仲裁队列1、创建交换机2、创建仲裁队列3、验证主节点宕机不影响消息发送和接收 流式队列(不推荐,Kafka主场)概念 异地容灾一、Federation插件概述 二、Federation交换机1、总体说明2、准备工作3、启用联邦插件4、添加上游连接端点5、…

【深度学习】TCN,An Empirical Evaluation of Generic Convolutional【二】

文章目录 膨胀卷积什么是膨胀卷积膨胀卷积公式PyTorch代码 从零开始手动实现一个1D膨胀卷积,不使用PyTorch的nn.Conv1d1. 基本概念2. 手动实现1D膨胀卷积 TCN结构如何使用TCN源码说明1. Chomp1d 类2. TemporalBlock 类3. TemporalConvNet 类 使用方法 膨胀卷积 什么…

DVWA - Brute Force

DVWA - Brute Force 等级:low ​ 直接上bp弱口令爆破,设置变量,攻击类型最后一个,payload为用户名、密码简单列表 ​ 直接run,长度排序下,不一样的就是正确的用户名和密码 ​ 另解: 看一下…

【SpringBoot + Vue 尚庭公寓实战】公寓杂费接口实现(八)

【SpringBoot Vue 尚庭公寓实战】公寓杂费接口实现(八) 文章目录 【SpringBoot Vue 尚庭公寓实战】公寓杂费接口实现(八)1、公寓杂费业务介绍2、公寓杂费逻辑模型介绍3、接口实现3.1、保存或更新杂费值3.2、保存或更新杂费名称3…

Android【SDK】 SDK是如何开发的,怎么打包aar包

文章目录 一、Android SDK开发示例工程二、Android SDK的开发三、打包aar包四、Android SDK的使用 一、Android SDK开发示例工程 本教程工程Git链接:https://gitcode.com/xiaohuihui1400/AndroidSdkExample/overview 二、Android SDK的开发 新建项目,…

Photoshop中图像美化工具的应用

Photoshop中图像美化工具的应用 Photoshop中的裁剪工具Photoshop中的修饰工具模糊工具锐化工具涂抹工具 Photoshop中的颜色调整工具减淡工具加深工具海绵工具 Photoshop中的修复工具仿制图章工具污点修复画笔工具修复画笔工具修补工具内容感知移动工具红眼工具 Photoshop中的裁…

Redis持久化主从哨兵分片集群

文章目录 1. 单点Redis的问题数据丢失问题并发能力问题故障恢复问题存储能力问题 2. Redis持久化 -> 数据丢失问题RDB持久化linux单机安装Redis步骤RDB持久化与恢复示例RDB机制RDB配置示例RDB的fork原理总结 AOF持久化AOF配置示例AOF文件重写RDB与AOF对比 3. Redis主从 ->…

智能制造uwb高精度定位系统模块,飞睿智能3厘米定位测距芯片,无人机高速传输

在科技日新月异的今天,定位技术已经渗透到我们生活的方方面面。从手机导航到自动驾驶,再到无人机定位,都离不开精准的定位系统。然而,随着应用场景的不断拓展,传统的定位技术如GPS、WiFi定位等,因其定位精度…

小摩法兴纷纷转多,看涨港股的时机来了吗?

恒生指数今日高开一度上涨89点报18520点,创近两周高。之后持续震荡下行;恒指临近中 午跌幅扩大,恒生科技指数一度跌近1.5%。截止收盘,恒生指数跌0.52%,盘面上,石油、煤炭、环保、建筑节能等板块涨幅居前&a…

VScode中js关闭烦人的ts检查

类似如下的代码在vscode 会报错,我们可以在前面添加忽略检查或者错误,如下: 但是!!!这太不优雅了!!!,js代码命名没有问题,错在ts上面,…

112、路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点…

简单且高效的水域物探轨迹坐标转换程序

简单且高效的水域物探轨迹坐标转换程序 前言 水上测线的高精度定位是水域物探的难题,水域磁法、水域地震实施时常采用船舶拖拽传感器进行走航式观测,GPS仪器放在船舶上测量,造成船舶位置与传感器位置存在偏差,后期资料整理需要校…

QT-QPainter实现一个可切换的开关控件

1、效果 2、核心代码 #ifndef SWITCH_H #define SWITCH_H #include <QWidget> #include <QTimer>

Javase.String 类

String 类 【本节目标】1. String类的重要性2. 常用方法2.1 字符串构造2.2 String对象的比较2.3 字符串查找2.4 转化2.5 字符串替换2.7 字符串截取2.8 其他操作方法2.9 字符串的不可变性2.10 字符串修改 3. StringBuilder和StringBuffer3.2 面试题&#xff1a; 4. String类oj4.…

【MySQL】 -- 用户管理

1. 权限 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。创建出非root用户&#xff0c;限制其权限。 权限这个概念拿出来就是用来限制非root用户的。这样从技术手段上保证了数据的安全性和完整性&#xff0c;防止有人删库…

【SAP Abap】一条SQL语句实现支持报表项配置的财务报表

【SAP Abap】一条SQL语句实现支持报表项配置的财务报表 1、业务背景2、配置项特殊处理3、实现方式&#xff08;Hana Studio SQL语句&#xff09;4、实现方式&#xff08;Abap OpenSQL语句&#xff09;5、总结 1、业务背景 在财务三大报表之外&#xff0c;业务需要使用类似的科…

数据库复习——模式分解

模式分解这边主要包括无损分解和保持函数依赖的分解两种形式&#xff0c;简单整理一下。 无损分解 把一个 R R R 分成 ρ { R 1 , R 2 , ⋯ , R k } \rho \{R_1,R_2,\cdots,R_k\} ρ{R1​,R2​,⋯,Rk​}&#xff0c;然后通过自然连接 R 1 ⋈ R 2 ⋈ ⋯ ⋈ R k R_1\bowtie R…

git的远程管理与标签管理

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2024年6月20日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&…

swift使用swift-protobuf协议通讯,使用指北

什么是Protobuf Protobuf&#xff08;Protocol Buffers&#xff09;协议&#x1f609; Protobuf 是一种由 Google 开发的二进制序列化格式和相关的技术&#xff0c;它用于高效地序列化和反序列化结构化数据&#xff0c;通常用于网络通信、数据存储等场景。 为什么要使用Proto…