实战AR增强现实【OpenCV+Ogre】

news2024/11/23 15:25:06

作为一份小小的礼物,我想向你展示借助 Ogre 和 OpenCV 自己制作增强现实变得多么容易。你应该知道,除了图形之外,我的另一个兴趣是计算机视觉。

演示将不依赖于 ARCore 或 ARKit 等专有解决方案 - 所有这些都将使用开源代码完成,你可以检查并学习。点击这里查看成品视频。

由于 OpenCV ovis 模块将 Ogre 和 OpenCV 结合在一起,这个演示可以在不到 50 行代码中完成。接下来,我将简要介绍所需的步骤。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、视频捕捉

首先,我们必须捕获一些图像才能通过 AR 中的现实部分。在这里,OpenCV 为我们提供了一个统一的 API,你可以将其用于网络摄像头、工业相机或预先录制的视频:

import cv2 as cv

imsize = (1280, 720) # the resolution to use
cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_WIDTH, imsize[0])
cap.set(cv.CAP_PROP_FRAME_HEIGHT, imsize[1])

img = cap.read()[1] # grab an image

2、相机跟踪

然后,我们必须设置 AR 中最关键的部分:摄像头跟踪。为此,我们将使用 ArUco 标记 - 围绕 Sinbad 的 QR 状四边形。毫不奇怪,OpenCV 附带了这种视觉算法:

adict = cv.aruco.Dictionary_get(cv.aruco.DICT_4X4_50)
# extract 2D marker-corners from image
corners, ids = cv.aruco.detectMarkers(img, adict)[:2]
# convert corners to 3D transformations [R|t]
rvecs, tvecs = cv.aruco.estimatePoseSingleMarkers(corners, 5, K, None)[:2]

如果仔细观察代码,就会发现我们使用了一个未定义的变量“K”——这是相机特有的内参矩阵。如果你想要精确的结果,则应校准相机以测量这些结果。例如,使用 calibdb.net 上的网络服务,如果你的相机已知,它也会为你提供参数。

但是,如果你只是想继续,则可以使用以下值,这些值应大致匹配 1280x720px 的任何网络摄像头:

import numpy as np
K = np.array(((1000, 0, 640), (0, 1000, 360), (0, 0, 1.)))

3、添加3D模型

现在我们有了图像和相应的相机 3D 变换——只缺少增强部分。这就是 Ogre/ovis 发挥作用的地方:

# reference the 3D mesh resources
cv.ovis.addResourceLocation("packs/Sinbad.zip")
# create an Ogre window for rendering
win = cv.ovis.createWindow("OgreWindow", imsize, flags=cv.ovis.WINDOW_SCENE_AA)
win.setBackground(img)
# make Ogre renderings match your camera images
win.setCameraIntrinsics(K, imsize)
# create the virtual scene, consisting of Sinbad and a light
win.createEntity("figure", "Sinbad.mesh", tvec=(0, 0, 5), rot=(1.57, 0, 0))
win.createLightEntity("sun", tvec=(0, 0, 100))
# position the camera according to the first marker detected
win.setCameraPose(tvecs[0].ravel(), rvecs[0].ravel(), invert=True)

你可以在这里找到上述步骤的完整源代码,它们完美地组合到主循环中。或者,查看此 Ogre 示例,它适用于通过 pip 安装的 Ogre 和 OpenCV。

要记录结果,你可以使用 win.getScreenshot() 并将其转储到 cv.VideoWriter 中 - 与名称相反,这是实时工作的。

扩展上述代码以使用 cv.aruco.GridBoard(如视频中所示)留给读者作为练习,因为这更多是在 OpenCV 方面。

此外,如果你更愿意在 Android 上使用 ARCore,有一个示例介绍如何将 SurfaceTexture 与 Ogre 结合使用。使用此示例,你应该能够修改 arcore-sdk 中的 hello_ar_java 示例以使用 Ogre。


原文链接:OpenCV实战AR增强现实 - BimAnt

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

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

相关文章

【ROS2】 默认的DDS通信中间件替换为Eclipse Cyclone_DDS (DDS配置方法)

ROS2替换中间件为Cyclone_DDS 1.一些介绍:)2.不同DDS的RMW实现3.默认的FastDDS替换为Cyclone DDSi.安装依赖ii.编译 cyclone-dds 4.配置网络 1.一些介绍:) 上一篇我们探讨了ros1和ros2编写launch的区别 【ROS2】launch启动文件编…

相机外参矩阵

在上一篇文章中,我们学习了如何将相机矩阵分解为内参矩阵和外参矩阵的乘积。在接下来的两篇文章中,我们将更详细地探讨外参矩阵和内参矩阵。首先,我们将探讨查看外参矩阵的各种方式,并在最后进行交互式演示。 SDT工具推荐&#xf…

程序员必知必懂运维技术概念

引言 随着互联网和云计算的迅速发展,传统的单体架构逐渐被微服务架构所取代。这一变化带来了许多新的挑战,如环境一致性、应用的可移植性、服务的扩展性、服务间通信的管理以及安全性等。为了解决这些问题,业界开发了许多工具和技术&#xf…

SPSSAU | Adaboost模型原理及案例实操

AdaBoost(Adaptive Boosting)算法的核心思想是将多个弱分类器组合成一个强分类器。其算法步骤如下: 第一:初始化权重,为每个训练样本分配相等的初始权重; 第二:训练弱分类器,根据当…

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时,需要综合考虑多个方面,包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案: 一、前期准备 确定安装位置: 根据使用需求和环境条件,选择一个…

基于FPGA的以太网设计(4)----详解PHY的使用(以YT8531为例)

目录 1、前言 2、如何了解PHY芯片? 2.1、总览 2.2、管脚 2.3、编码 2.4、自协商 2.5、环回模式 2.6、睡眠模式 2.7、复位 2.8、PHY地址 3、PHY芯片的寄存器配置 3.1、Basic Control Register (0x00) 3.2、Basic StatusRegister (0x01) 3.3、PHY Specific Status…

重生了,这一世 我一定要学会服务器 只因………

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…

IT运维管理与ITSM:理论与实践

IT运维管理和IT服务管理(ITSM)在现代企业信息化过程中占据着举足轻重的地位。它们不仅是确保IT系统稳定运行和业务连续性的关键,还是推动企业数字化转型、提升竞争力的重要力量。本文将结合《IT运维管理和ITSM》文档的内容,深入探…

【C++/STL】:哈希的应用 -- 位图布隆过滤器

目录 🚀🚀前言一,位图1. 位图的概念2. STL库中的位图3. 位图的设计4. 位图的模拟实现5. 位图的优缺点6. 位图相关考察题⽬ 二,布隆过滤器1. 布隆过滤器的概念2. 布隆过滤器的实现3. 布隆过滤器删除问题4. 布隆过滤器的优缺点 点击…

江森自控引入电子签,“碳”索智能建筑数字未来

近年来,伴随着科技的不断进步和市场领域的持续延伸,智能建筑已然成为建筑业科技升级的必经之路。 作为智能建筑领域的全球领导者,江森自控始终走在数字化变革前列,并在业内率先引入了电子合同,通过全流程线上进行的签…

【办公类-53-03】2024年第一学期校历制作(“月/日(星期)”版、排班表、跳过节日和周三)

背景需求: 前期代码制作出2024年第一学期校历,按照5天一周的方法,提取实际工作日。制作成“周计划教案”使用的长日期、短日期 -【办公类-53--01】2024年第一学期校历制作(星火讯飞提取实际工作日,5天一行&#xff0…

Spring-Retry 框架实战经典重试场景

Spring-Retry框架是Spring自带的功能&#xff0c;具备间隔重试、包含异常、排除异常、控制重试频率等特点&#xff0c;是项目开发中很实用的一种框架。 1、引入依赖 坑点&#xff1a;需要引入AOP&#xff0c;否则会抛异常。 xml <!-- Spring-Retry --> <dependency&…

【AI大模型】通义千问:开启语言模型新篇章与Function Call技术的应用探索

文章目录 前言一、大语言模型1.大模型介绍2.大模型的发展历程3.大模型的分类a.按内容分类b.按应用分类 二、通义千问1.通义千问模型介绍a.通义千问模型介绍b.应用场景c.模型概览 2.对话a.对话的两种方式通义千问API的使用 b.单轮对话Vue页面代码&#xff1a;Django接口代码 c.多…

【C++】—— 类与对象(一)

【C】—— 类与对象&#xff08;一&#xff09; 1、类的定义1.1、类定义1.1.1、类定义格式1.1.2、成员变量的标识1.1.3、C 中的 s t r u c t struct struct1.1.4、C 中的内联函数1.1.5、总结 1.2、访问限定符1.3、类域 2、实例化2.1、实例化的概念2.2、对象大小2.2.1、对象的大…

【Hot100】LeetCode—1143. 最长公共子序列

目录 题目1- 思路2- 实现⭐最长公共子序列——题解思路 3- ACM 实现 题目 原题连接&#xff1a;1143. 最长公共子序列 1- 思路 模式识别1——> 求子序列问题 ——> dp数组定义为 i-1 和 j-1 动规五部曲 1- 创建dp数组 dp[i][j]&#xff0c;代表以 i-1 结尾的 text1 和…

“外挂”——逆向软件的分析与破解

本文来源无问社区&#xff0c;更多实战内容&#xff0c;渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/11458.html#maodian1 前言&#xff1a; “外挂”的制作离不开软件的分析破解&#xff0c;这平时做ctf中的逆向题是有⼀定的差别的。最直观的区别体现在…

Leetcode 438. 找到字符串中所有字母异位词(java实现)

解题思路&#xff1a;滑动窗口。 异位词的典型解题方法就是用数组来统计出现的个数。本题也不例外。 直接上代码来进行讲解&#xff1a; public List<Integer> findAnagrams(String s, String p) {//初始化返回数组List<Integer> res new ArrayList<>();if …

百问网全志T113-PRO LVGL环境配置

运行LVGL示例 启动开发板 ​ 按要求接入电源或Type-c数据线&#xff0c;拨动拨码开关&#xff0c;将开发板上电 运行LVGL示例 ​ 打开串口终端软件&#xff0c;这里我使用MobaXterm软件演示&#xff0c;选择开发板的串口终端号&#xff0c;可以在设备管理中查看 这里我的串…

喜加一!望繁信科技再摘「2023年度新锐技术品牌奖」

1月31日&#xff0c;望繁信科技再次获颁由全球知名科技社区InfoQ评选的「2023年度新锐技术品牌奖」。这是InfoQ连续第二年将该奖项授予望繁信科技&#xff0c;用以肯定过去一年中&#xff0c;望繁信科技在流程挖掘与智能领域的技术创新与业务价值创造。 InfoQ在颁奖词中写到&…