本节内容标志着本项目的收尾部分,其中不仅成功实现了两种跟踪点的选择及跟踪恢复的策略,而且还将增强现实中的物体替换为了互动性更强的增强现实游戏。
首先,我们来探讨一下跟踪点的选择问题。在之前的文章中,我们采用了ORB算法来检测特征点,随后通过手动方式挑选出N个ORB角点,并运用LK光流法进行跟踪。我们首先确定三维空间中点的具体位置,例如,正方形的四个顶点坐标分别为(-1,-1,0),(1,-1,0),(1,1,0),(-1,1,0)。接着,在二维图像中,我们手动依次挑选出四个符合规则的二维点。最后,将这些对应的二维三维点输入solvePnP函数进行计算,以确定相机的姿态。这种方法的优势在于,我们能够从起初便手动选定一个平面,这个平面并不必然与相机平面平行,因而显得更为逼真。此外,我们还能自主调节solvePnP处理中的对应点对数量。然而,预先设定的三维点集相对有限,难以应对复杂多变的现实世界。
在寻找与既定3D点对应的2D点时,我们采取了一种不同的策略:首先识别出2D点,接着选定一个点作为坐标原点,再计算所有点与该原点的距离,并将这些距离除以一个变量(该变量的大小取决于点的远近),从而得到3D点的x轴和y轴坐标,而z轴的值则设定为0。通过这种方式,我们不仅确定了3D点的位置,还确立了一个平面,尽管这个平面最初是与我们的相机平行,显得不够真实,但它足以用于识别和追踪现实世界中的各种物体。在SolvePnP中,处理大量的点对时,必须注意根据实际情况不断进行调整。这种通过3D点对应检测到的2D点进行计算的方法,对于后续我们将讨论的第二种特征点跟踪恢复技术非常有帮助。
在详细阐述实现方法之前,我们首先对ORB算法进行一番优化。考虑到GoodFeaturesToTrack函数中对于最小距离的应用,我们萌生了针对ORB算法进行微调的想法。具体做法是设定任意两个ORB角点间的最小距离为10个单位,并将距离小于或等于10个单位的点予以剔除。这一实现过程与循环删除数组中元素,直至任意两个元素间的距离均超过某个特定值的方法相似。
最小距离: 3
严禁对专有名词进行修改,同时不得插入任何英文词汇。改写后的内容需保持与原文相同的语言风格,并去除最前面的序号。将长句拆分为若干短句,以逗号分隔。确保不遗漏任何句子末尾的标点符号。
步骤1: 1 4 8 5 6 4 7 8 9 10 12
步骤2: 1 4 8 7 8 9 10 12
步骤3: 1 4 8 12
代码如下:
void DlimiteOrb(vector& inigoodfeatures) { vector newgoodfeatures; Point2f temp1,temp2; for(size_t i = 0;i 10) 新增功能列表中加入了temp2元素。 } 将原有良好特性赋值给新良好特性。 newgoodfeatures.clear(); } }
结果如下:


前文已阐述过,2D至3D点特征点的选取方法开yun体育app官网网页登录入口,现对其进行了微调。我们设定了九个特定点,其中一点作为核心,其余八个点则依照正方形的边长逐渐增大进行搜寻。具体操作如图所示,在逐渐增大的绿色正方形区域内寻找剩余八个点,最终在边长为84*2的正方形内成功定位,并用红色进行标记。

定位这9个二维点与既定三维点集进行匹配,随后借助这组二维与三维点集来估算相机的最新姿态。对于这种棋盘格图案,其特征点排列呈现明显规律,非常适合用于寻找追踪点。至于追踪的恢复,我的想法是这样的:
跟踪点丢失前:

若左侧缺失,需计算x加3,接着对缺失点的y坐标进行评估,若其值为最小,则增加3;若为最大,则减少3。若y坐标介于两者之间,则无需增减。

若右侧部分缺失,需计算x减3的值,接着对比丢失点的y坐标,若其为最小值,则加3;若为最大值,则减3。若y坐标处于中间范围,则不做任何加减操作。

在上方缺失的情况下,先计算y加3,接着需确认缺失位置的x坐标是否为最小值,若是,则加3;若为最大值,则减3。若x坐标既不是最小也不是最大,则保持不变,不加不减。

若该点位于下方,则需检查其横坐标y-3,并据此判断其是否为最小值,若是,则增加3;若为最大值,则减少3。若既不是最小也不是最大,则保持不变。

左丢失恢复跟踪的例子:

上丢失恢复跟踪的例子:

以下是第一种跟踪恢复的技巧及其实验成效,适用于棋盘或具有规律分布特征点的物体,详细实现代码可点击此处下载:cmonoFTSSG。个人觉得借助机器学习使系统学会如何发现新的补偿点是个不错的方法,尽管目前我还未涉足这一领域,未来我会努力学习的。
第二种3D点对应2D点的特征点选取方法,如下图所示:

我们首先对二维点进行检测,接着选取一个点作为坐标的原点,并计算所有点与该原点的距离,将此距离除以一个变量(该变量根据点与原点的距离大小来设定)后,得到三维点的x轴和y轴坐标,而z轴的值则设为0。实验结果显示,这种方法不仅能在棋盘上有效捕捉和跟踪,即便是在普通场景中也能实现。

图中的AR物体由彩色立方体转变成了3D推箱子游戏,这款游戏的源代码我是在网络上搜寻到的,并获取了下载链接。我对程序进行了调整,更换了部分贴图——比如,我使用了两年前学习游戏编程时制作的ice.cc Game Studio小图标,那时我还怀揣着组建个人游戏工作室的梦想呢——同时,我还对OpenGL参数进行了修改,以便将游戏画面绘制在地图上。绘制地图时不允许开启光源,而在进行推箱子游戏时则需打开光源。使用W、A、S、D键可操控箱子移动,其余快捷键的用法及原因将在此进行详细说明。
接下来,我们将探讨如何恢复跟踪。首先,我们需要分析图像中的二维点与实际空间中的三维点之间的联系,并对其进行推导。

通过分析图像中的二维点与三维空间点之间的关联矩阵,我们可以导出(1)(2)(3)三个公式。将公式(3)代入公式(1)和(2)中,并将Zw的值设为0,从而得到一组等式,这些等式经过整理后可以表示为矩阵形式。

通过观察矩阵,我们可以轻易地看出,在已知相机内参数fx、fy、u0、v0以及相机的姿态R和T之后,仅凭一组二维点坐标(x,y),我们便能够运用克莱姆法则,求出该线性方程组(其系数行列式不为零)的唯一解,即(Xw,Yw)。当特征点数量低于9个时,我们便启动恢复跟踪机制,借助前一帧中丢失前的相机姿态参数R和T,以及当前帧的ORB特征点,结合相机内参数进行计算kaiyun.ccm,从而得到新的3D点集。接着,我们将这些点集输入solvePnP算法,以计算新的相机姿态,以便继续追踪特征点。此方法在特征点丢失次数较少时表现稳定,但若丢失次数增多,其稳定性将受到影响,因为每次计算都不可避免地存在微小的误差。
结果如下图所示:
棋盘:

任意场景:

正如前文所述,当丢失次数较少时云开·全站体育app登录,系统表现出较强的鲁棒性;然而,一旦丢失次数增多,误差便会增大,导致系统变得不稳定。
具体实现代码点击下载:cmonoFTSSG2.0
项目已告一段落,通过LK光流法对ORB特征点进行跟踪,并使用计算得出的2D/3D点集来更新相机的姿态。最终,在OpenGL中确定了AR物体的具体位置并绘制出来。此外,系统具备一定的跟踪恢复能力。其运行速度迅速,且在特定条件下表现稳定,具有很高的鲁棒性。在整个项目的实施过程中,我积累了丰富的计算机视觉知识,这些知识将对我未来的项目产生重要影响。本工程使用一台摄像头,所捕捉的影像是二维的。接下来,我计划利用OpenNI技术从XtionProLive(一款RGB-D相机)中获取含有深度信息的3D图像,并通过一系列算法完成三维重建。此外,我还将融入手势识别或语音识别技术,打造一款新型的人机交互设备(类似于Hololens)。期待与各位共同探讨,共同推动世界变革!
————————————————
我从事的是非标自动化设备的制造领域,这个领域涵盖了运动控制、机器视觉以及机电控制等多个方面。我报名参加了大模型应用的相关课程,近期学习了如何调用大模型API。现在,我在思考课后作业的具体内容。针对非标自动化行业与大型模型API相结合的课后作业,我建议可以从行业面临的实际问题出发,设计并开发出具有实用性的工具原型。该设备故障智能诊断助手通过API技术搭建了多轮对话系统,用户可以输入设备报警的代码或对故障现象进行描述,系统则会输出一份详尽的故障原因排查树。该排查树整合了PLC错误码库以及维修手册等内容。
Ollama模型的下载链接为https://ollama.com/,如需浏览可用的模型清单,请访问https://ollama.com/library。勇哥选择了deepseek-r1:1.5b模型,下载工作已经圆满结束。接下来,只需运行run命令,即可启动模型并开展对话交流。编写一段Python脚本:导入requests库,定义OLLAMA_API_URL变量,其值为本地API的端点地址“...”。

