Unity 和 OpenCV:结合计算机视觉和游戏开发

文章目录

  • 前言
  • 一、Unity 中集成 OpenCV
    • 1. 安装OpenCV plus Unity 插件
    • 2. 导入 OpenCV 包
  • 二、图像处理应用程序的创建
    • 1. 实时轮廓检测
    • 2. 粒子发射器
    • 3. 碰撞区域
  • 三、效果
  • 四、总结


前言

Unity 和 OpenCV 是两个强大的开发工具,分别用于游戏开发和计算机视觉。结合它们可以实现一些有趣和创新的项目。本篇博客将介绍如何在 Unity 中集成 OpenCV,以及如何利用它们的结合来创建令人惊叹的应用程序。


一、Unity 中集成 OpenCV

1. 安装OpenCV plus Unity 插件

首先,我们需要在 Unity 中安装 OpenCV plus Unity插件。这个插件提供了与 OpenCV 库集成的功能,使我们能够在 Unity 中使用 OpenCV 的强大功能。
在这里插入图片描述

2. 导入 OpenCV 包

在安装插件后,我们需要导入 OpenCV 包到 Unity 项目中。这将包括所需的库文件和相关的脚本文件,以便我们可以开始在 Unity 中使用 OpenCV。
在这里插入图片描述

二、图像处理应用程序的创建

1. 实时轮廓检测

我们将使用 OpenCV 在 Unity 中实现实时轮廓检测。CountourFinder.cs将捕获摄像头输入,并使用 OpenCV 查找图像中的轮廓。检测到的轮廓将被用于在 Unity 中绘制形状,并且可以与游戏对象进行交互。
在这里插入图片描述

// CountourFinder.cs 脚本
// 使用 OpenCV 在 Unity 中实现实时轮廓检测
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using OpenCvSharp;
using OpenCvSharp.Demo; 
using UnityEngine; 
using UnityEngine.UI; //继承 WebCamera 类
public class CountourFinder : WebCamera
{// 图像翻转模式[SerializeField] private FlipMode imageFlip;// 阈值[SerializeField] private float threshold = 96.4f;// 曲线精度[SerializeField] private float curveAccuracy = 10f;// 最小区域[SerializeField] private float minArea = 5000f; // 多边形碰撞器[SerializeField] private PolygonCollider2D polygonCollider; // 切换按钮[SerializeField] private Toggle toggle;private Mat _image; // 图像private Mat _processImage = new(); // 处理后的图像private Point[][] contours; // 轮廓private HierarchyIndex[] _hierarchy; // 层级private Vector2[] vertorList; // 点的列表// 重写 ProcessTexture 方法,处理图像纹理protected override bool ProcessTexture(WebCamTexture input, ref Texture2D output){// 将输入的图像纹理转换为 Mat 类型_image = OpenCvSharp.Unity.TextureToMat(input); // 翻转图像Cv2.Flip(_image, _image, imageFlip); // 转换为灰度图Cv2.CvtColor(_image, _processImage, ColorConversionCodes.RGB2GRAY); // 阈值化Cv2.Threshold(_processImage, _processImage, threshold, 255, ThresholdTypes.BinaryInv); // 查找图像中的轮廓Cv2.FindContours(_processImage, out contours, out _hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple, null); // 重置碰撞器路径数polygonCollider.pathCount = 0; // 遍历每个轮廓foreach (Point[] contour in contours){// 近似多边形Point[] points = Cv2.ApproxPolyDP(contour, curveAccuracy, true); // 计算轮廓面积var area = Cv2.ContourArea(contour); // 如果面积大于最小面积if (area > minArea) {// 绘制轮廓DrwaContour(_processImage, new Scalar(127, 1271, 127), 2, points); // 增加碰撞器路径数polygonCollider.pathCount++; // 设置碰撞路径polygonCollider.SetPath(polygonCollider.pathCount - 1, ToVertor2(points)); }}if (output == null){// 将图像转换为纹理output = OpenCvSharp.Unity.MatToTexture(toggle.isOn ? _processImage : _image); }else{// 将图像转换为纹理OpenCvSharp.Unity.MatToTexture(toggle.isOn ? _processImage : _image, output); }return true; // 返回 true}// 将 Point 数组转换为 Vector2 数组private Vector2[] ToVertor2(Point[] points){vertorList = new Vector2[points.Length]; for (int i = 0; i < points.Length; i++) {// 将点转换为 Vector2vertorList[i] = new Vector2(points[i].X, points[i].Y); }return vertorList; }// 绘制轮廓private void DrwaContour(Mat image, Scalar color, int thickeness, Point[] points){for (int i = 1; i < points.Length; i++) {// 绘制线段Cv2.Line(image, points[i - 1], points[i], color, thickeness); }// 绘制最后一条线段Cv2.Line(image, points[^1], points[0], color, thickeness); }
}

2. 粒子发射器

在 Unity 中,我们可以创建一个粒子发射器,用于在场景中生成粒子效果。这个发射器可以与 OpenCV 实现的图像处理功能结合,根据检测到的图像特征来控制粒子的生成和运动。
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Emitter : MonoBehaviour
{[SerializeField] private GameObject spawnPrefab; // 生成的预制体[SerializeField] private float spawnRate = 0.1f; // 生成速率[SerializeField] private int maxParticles = 3; // 最大粒子数量[SerializeField] private Vector2 sizeRange; // 大小范围private GameObject[] _pool; // 对象池// Start is called before the first frame updatevoid Start(){InitializePool(); // 初始化对象池Spawn(); // 开始生成粒子}// Update is called once per framevoid Update(){}// 初始化对象池private void InitializePool(){_pool = new GameObject[maxParticles]; // 根据最大粒子数量创建对象池for (int i = 0; i < maxParticles; i++){var particle = Instantiate(spawnPrefab); // 实例化预制体particle.SetActive(false); // 初始时将粒子设置为不激活状态_pool[i] = particle; // 将粒子添加到对象池中}}// 生成粒子private void Spawn(){foreach (var particle in _pool){if (!particle.activeSelf) // 如果粒子不是激活状态{// 随机生成粒子位置,并转换为世界坐标系下的位置particle.transform.position = transform.TransformPoint(Random.insideUnitSphere * 0.5f);// 随机设置粒子大小particle.transform.localScale = Random.Range(sizeRange.x, sizeRange.y) * Vector3.one;particle.SetActive(true); // 激活粒子break; // 结束循环}}Invoke("Spawn", spawnRate); // 延迟 spawnRate 时间后再次调用 Spawn 方法}
}

3. 碰撞区域

最后,我们将在 Unity 中创建一个碰撞区域,用于检测粒子与特定区域的碰撞。当粒子进入碰撞区域时,将触发特定的事件,例如使粒子消失或触发特效。
在这里插入图片描述

// KillZone.cs 脚本
// 在 Unity 中创建碰撞区域,用于检测粒子与特定区域的碰撞using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class KillZone : MonoBehaviour
{private void OnTriggerEnter2D(Collider2D col){col.gameObject.SetActive(false);}
}

三、效果

在这里插入图片描述

四、总结

结合 OpenCV 和 Unity 可以实现许多有趣和创新的项目。通过利用 OpenCV 在 Unity 中的集成,我们可以创建出令人惊叹的图像处理和游戏开发应用程序。无论是学习者还是专业开发者,都可以从这种结合中受益,并创造出令人印象深刻的作品。

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

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

相关文章

记一次内存泄漏分析(待写稿)

背景 线上Flink频繁重启&#xff0c;先后排查了很多情况&#xff0c;目前在内存阶段排查&#xff0c;首先说说学到的知识 内存泄漏分析 JVM常用命令 JConsole JVisualvm 快照的这里是最有用的&#xff0c;它和jmap不同&#xff0c;jmap查找的是占用字节最多的类&#xff…

剑指Offer|LCR 014. 字符串的排列

LCR 014. 字符串的排列 给定两个字符串 s1 和 s2&#xff0c;写一个函数来判断 s2 是否包含 s1 的某个变位词。 换句话说&#xff0c;第一个字符串的排列之一是第二个字符串的 子串 。 示例 1&#xff1a; 输入: s1 "ab" s2 "eidbaooo" 输出: True 解…

Java编程题_面向对象和常用API01_B级

Java编程题_面向对象和常用API01_B级 第1题 面向对象、异常、集合、IO 题干: 请编写程序&#xff0c;完成键盘录入学生信息&#xff0c;并计算总分将学生信息与总分一同写入文本文件 需求&#xff1a;键盘录入3个学生信息(姓名,语文成绩,数学成绩) 求出每个学生的总分 ,并…

用户界面的UML建模05

4 抽象表示层建模&#xff08;Abstract Presentation Modeling&#xff09; 在进行应用程序建模时&#xff0c;很自然地会需要对UI 表示层进行建模。甚至是对于非常简单的场景&#xff08;scenario&#xff09;而言&#xff0c;UI 表示层部分的建模都是必不可少的。在这个阶段…

2024.12.25在腾讯云服务器上使用docker部署flask

2024.12.25在腾讯云服务器上使用docker部署flask 操作系统&#xff1a;Ubuntu 根据腾讯云的说明文档安装 Docker 并配置镜像加速源&#xff0c;注意需要安装腾讯云的加速源&#xff0c;使用官网的加速源连接极其不稳定&#xff0c;容易导致运行失败。使用哪个公司的云服务器就…

存储块的删除与状态查询

目录 存储块的删除 设计实现 存储块的删除 仅需删除任务列表的所有任务&#xff0c;无需在意空闲存储块。 设计实现 存储块的删除&#xff08;清空过程中可能有任务就绪&#xff0c;需执行一次调度&#xff09;存储块的状态查询&#xff08;当前存储块的计数、允许的最大计数、…

如何在IDEA一个窗口中导入多个项目

一般在IDEA窗口中想导入一个新项目&#xff0c;会提示我们在当前窗口还是新窗口。如果选新窗口&#xff0c;就会新打开一个窗口&#xff0c;此时新窗口里面只有新导入的项目。 而为了浏览起来更方便&#xff0c;需要实现在IDEA一个窗口中导入多个项目。具体步骤如下&#xff1…

SQL 实战:基于经纬度的距离计算与位置查询

在位置服务&#xff08;LBS&#xff09;系统中&#xff0c;基于地理位置查询和距离计算是核心功能之一。例如&#xff1a; 查找附近的商铺、加油站或医院。计算两点之间的实际直线距离。筛选出指定范围内的用户或设备位置。 MySQL 提供了多种方式实现地理位置查询&#xff0c…

SpringCloudAlibaba技术栈-Higress

1、什么是Higress? 云原生网关&#xff0c;干啥的&#xff1f;用通俗易懂的话来说&#xff0c;微服务架构下Higress 就像是一个智能的“交通警察”&#xff0c;它站在你的网络世界里&#xff0c;负责指挥和调度所有进出的“车辆”&#xff08;也就是数据流量&#xff09;。它的…

现代图形API综合比较:Vulkan DirectX Metal WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

工业大数据分析算法实战-day19

文章目录 day19讨论范畴介绍知识工程 知识沉淀方法的维度模型模型要素维度传感器异常报警异常预警的范式&#xff1a;特征量-征兆量-研判规则健康评估的范式&#xff1a;劣化度-健康度-综合评价故障类型研判范式&#xff1a;特征量-证据/现象-推理逻辑故障处理效果监控范式&…

轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片

轮胎识别数据集&#xff0c;可对生产流水线里的轮胎图片标注&#xff0c;支持yolo&#xff0c;coco json&#xff0c;voc xml格式的标注&#xff0c;一共785张采集图片 数据集分割 训练组90&#xff05; 706图片 有效集6% 46图片 测试集4% 33图片 预处理…

【RabbitMQ的死信队列】

死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false)&#xff0c;并且在消费后&#xff0c;向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…

YOLOv10目标检测-训练自己的数据

yolov10 https://github.com/THU-MIG/yolov10?tabreadme-ov-file 1. 数据集 模型的建立需要收集图片并且进行标注。YOLOv10标注的文件格式如下&#xff08;每张图片对应一个标签文件&#xff09;&#xff1a; 0 0.441753 0.815461 0.061021 0.042763 1 0.395895 0.759868 …

《机器学习》——KNN算法

文章目录 KNN算法简介KNN算法——sklearnsklearn是什么&#xff1f;sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors&#xff0c;通过寻找k个距…

如何在 Ubuntu 22.04 上安装和使用 Composer

简介 如果你是一名 PHP 开发者&#xff0c;想要简化你的项目依赖管理&#xff0c;那么 Composer 是一个必不可少的工具。Composer 可以简化包管理&#xff0c;并允许你轻松地将外部库集成到你的项目中。 本教程将向你展示如何在 Ubuntu 22.04 操作系统上安装 Composer&#x…

139.《python中的正则详解》

文章目录 什么是正则正则表达式语法正则demo1.匹配模式2.finditer3.正则分组4.非捕获组5.分组的引用6. 正则替换7.正则切割7.正则「或」7.枚举取反 面试题 前言: 拉开差距的不是上班的8小时,而是下班后的16小时,同志们,加油,卷起!!! 什么是正则 1.正则表达式是一种高级文本处理…

大语言模型(LLM)中大数据的压缩存储及其重要性

在大型语言模型&#xff08;LLM&#xff09;中&#xff0c;KV Cache&#xff08;键值缓存&#xff09;的压缩方法及其重要性。 为什么要压缩KV Cache&#xff1f; 计算效率&#xff1a;在生成文本的过程中&#xff0c;每个生成的token都需要与之前所有的token的键值&#xff…

『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释

评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释 文章目录 一. ELO Rating大模型的elo得分如何理解1. Elo评分的基本原理2. 示例说明3. 大模型中的Elo得分总结3个模型之间如何比较计算,给出示例进行解释1. 基本原理扩展到三方2. 示例计算第一场: A A…

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及&#xff0c;即便是零编程基础或基础薄弱的用户&#xff0c;也可以借助AI完成许多技术任务。然而&#xff0c;要高效地使用AI完成编程任务&#xff0c;关键在于如何清晰表达需求&#xff0c;并逐步引导AI实现目标。 在本文中&#xff0c;我们将通过开发…