重生学神有系统
时间:2023-05-21 来源: 作者:一碗酸梅汤
江寒将“神机”拆下来后,交给了靳雪雯。
随后,小丫头用b线,将“神机”连到了笔记本电脑上。
开发专用的ide也已经准备就绪了。
江寒开始在纸面上设计算法,并让靳雪雯修改相应的代码。
首先要做的,是调整摄像头工作时的分辨率。
“战神一号”搭载的这颗摄像头,一共支持三种分辨率:x。
清晰度越高,获得的图像质量自然越好,但处理起来也就越慢。
因此,江寒一上来就让靳雪雯将摄像头的工作模式,调整到了。
然后通过调整曝光时间,以及矫正gaa值等手段,获得更好的图像质量。
接下来,就是第一个关键点:机体识别算法。
靳雪雯在自己编写的程序中,使用了官方的图像识别框架,实现了在采集到的图像中,匹配机体外壳上的特征图案。
江寒看了一下框架的源代码,就知道这个东西能不用最好不用。
这个框架复杂而且臃肿,效能十分低下。
唯一的优点就是易学易用,即使是初中生,也可以只用几个月的时间掌握它。
但现在既然追求极限的效率,那就必须抛弃它,从零开始造轮子!
江寒提出了这一点,靳雪雯却犯了愁:“从头写底层……那太难了吧?一晚上的时间,只怕不太够啊。”
江寒微微一笑,平静地说:“这个模块我来写吧,等下你再把它整合到主程序里。”
顿了顿:“当然,平台相关的部分,还有涉及到硬件操作的地方,你得随时给我指点,不然我还得时不时去翻官方的白皮书。”
靳雪雯欣然应允,将笔记本电脑推到了江寒面前。
江寒开始工作。
图像识别算法的改进方案,早就在江寒的脑海中了。
实战时用来检测碰撞的“皮肤”上,集成了一些用来显示血量等信息的led灯。
用来检测和判定敌机,无疑是比较适合的。
首先由于led是发光的,那么就可以调低曝光,以屏蔽环境光干扰;
再二值化处理一下,图像中除了led部分,就都变成了黑色……
预处理做得好,在后续步骤中,可以大大降低计算量。
至于如何识别图像中的机体……
江寒的第一个念头,就是各种人工神经网络算法。
运用深度学习技术,对输入图像进行识别,输出所属类别和定位信息……
看起来的确相当有可行性。
但江寒稍微深入一想,就知道这个办法只是看起来很美,在比赛中很可能行不通。
(iishu)是,,,,!
第330章 小孔成像和PNP问题
【】(iishu),
要想利用“人工神经网络”处理图像识别问题,需要事先收集到大量的数据。
可是仓促之间,上哪去弄数据?
倒是可以给“战神一号”拍一些“写真”,来充当训练集,反正所有的参赛机器人,外形都差不多。
这样做倒也不是不行,但时间太仓促了,数据的量级达不到要求,训练效果应该不会太好。
而且,就算拼着一夜不睡,东拼西凑出一点训练数据,也很可能来不及训练了。
训练“人工神经网络”,毕竟是一件比较消耗时间的事情。
而现在最大的问题,就是缺少时间,明天就要正式上场了的说……
何况,“人工神经网络”的优势在于通用性和准确率,在特定问题上的识别速度,还真不见得能比得上精心优化过的“笨办法”。
所以江寒仔细思考了一番之后,还是决定采用“几何形状匹配”的思路来做图像识别。
这种办法的优点是识别速度比较快,更容易获得高帧率。
编程的复杂度可能稍微高了一点,但这对江寒来说,并不是什么太大的问题。
他先新建一个cpp文件,以及对应的h头文件,然后创建一个新的类,用于容纳自己的图像识别算法。
接下来就可以正式编码了。
江寒一边思考,一边编写代码,靳雪雯在一边安静地看着。
两人偶尔也交流一两句,讨论一下编程思路、函数的功能之类的问题。
“江寒哥哥,这几个语句是做什么用的啊?”
“这个是图像预处理,按照自定义的阈值,将每个像素二值化……”
“那江寒哥哥,这个函数呢?我有点看不懂……”
“哦,这个叫膨胀处理,可以让图像的轮廓更加明显……”
……
二十多分钟后,江寒搞定了图像预处理的相关代码。
这部分要做的事情很简单,就是将摄像头拍到的图像,先处理成灰度图,然后二值化,只留下led灯部分。
接下来,要在图像中遍历像素、寻找led灯的轮廓。
这是整个算法中计算量最大的部分。
好在江寒对图片的预处理,做得相当到位,将这一步所消耗的时间,基本上压缩到了极限。
找到led灯后,下面的事情就简单了,遍历轮廓、提取led灯,再匹配筛选、找到机体轮廓,然后就可以锁定目标攻击了。
在做机体轮廓分析时,江寒考虑了一下,使用了模板匹配技术。
这样一来,就进一步减少了运算量,节省了时间。
到了这里,目标识别就基本完成了。
接下来,就可以测算目标的方位和距离了。
这一步涉及到图片坐标系与大地坐标系之间的换算,算法复杂度相当高。
但江寒岂是欺软怕硬的人呢?
只要舍得脑力全开,肯定是搞得定的。
然而,这样又有一个新问题,可别不等完成编码,大脑的能量就消耗殆尽了。
那种空虚乏味的感觉,可是相当难受的……
所以江寒想了想,就笑眯眯地说:“小蚊子,可以拜托你一件事吗?”
靳雪雯精神一振,摩拳擦掌地说:“江寒哥哥,快说、快说,是什么事?”
自己闲了这么久,总算可以派上点儿用场了……
江寒微微一笑,说:“帮我打个电话给前台,要点宵夜。”
“没问题!”靳雪雯脆生生地答应了一声。
然后拿出手机,喜滋滋地问:“江寒哥哥,你想吃什么呀?”
“冰岛红极参,问问哪里有,然后让前台帮忙订做两盘,送到大厅来。”
“好的。”靳雪雯立即拨号。
江寒想了想,又补充说:“口味随便,红烧、清蒸无所谓……哦,对了,让他们把点餐的钱加到我账单里。”
靳雪雯一摆手:“不用,你教我改程序,我还不知道怎么感谢呢!
再说咱们战队刚刚成立,本队长请吃个宵夜,也是应该的吧?”
江寒呵呵一笑:“小蚊子啊,你可能不太清楚,这种地方,一条红极参只怕得7、8百块。”
靳雪雯嘻嘻一笑:“没事,让爸爸买单就行了,他赚钱就是给我和妈妈花的嘛。”
江寒:“……”
有点无言以对的感觉。
眼前这一只,莫非就是传说中的富萝莉?
毕竟有句话说得好,十个萝莉九个富,还有一个……
靳雪雯很快安排完宵夜,然后继续看江寒编程。
江寒接下来就开始编写目标测算模块。
靳雪雯原本使用的办法,是直接用像素坐标来计算旋转角度。
这样做倒也不是一定不行,但比较麻烦,而且效果也不会太好。
这是因为像素坐标差与角度之间,并不是线性关系,必须根据像素的坐标,随时矫正换算比例,才能得到一个不很精确的近似值。
江寒思考了一下,根据“小孔成像”的原理,设计了一个简单而又巧妙的算法,通过像素坐标算出了正确的转角。
想要从图像数据中得到物理世界的坐标,需要先标定摄像头,从而得到摄像头的内参。
这一步可以使用opencv中的标定工具来做。
标定完摄像头后,就能得到摄像头的内参矩阵和畸变参数。
根据这两组参数,对像素值的坐标进行矫正,然后就可以通过反三角函数,来计算出需要的角度了。
写完算法之后,江寒又设计了一个小实验,对其进行了验证。
实验结果表明,这个算法完全ok,准确率和速度都优于靳雪雯原来的算法。
但这种算法也有一个相当明显的缺陷,由于缺失了深度信息,因此无法对坐标系进行变换操作。
这样一来,就只能得到相对于摄像头中心的转角……
那么如何解决深度的问题,得到三维坐标呢?
江寒又设计了一种算法,通过求解pnp问题,来得到敌我双方在真实空间中的坐标偏移。
piven-potproble。
江寒对这个算法不是十分熟悉,只知道可以用来处理空间定位问题。
所以,他先去网上找了几篇文献,仔细浏览,理解了原理之后,才开始编写自己的代码。
首先标定摄像头,得到相机的内参矩阵和畸变参数,然后测量物体的尺寸,得到物体在世界坐标系中的坐标。
接下来,从图像中得到机体的像素坐标,然后通过lvepnp函数计算出平移向量,对坐标进行平移操作。
最后再修正一下y轴和z轴的坐标,就可以通过反三角函数,计算出所需要的角度值了。
这种算法可以得到物体在三维空间中的坐标,缺点是需要计算四个点,而第一种算法,利用小孔成像的原理,只需要计算一个点就够了。
两种办法各有优缺点,可以分情况,灵活运用。
当目标距离十分遥远时,就用“小孔成像法”计算角度;距离合适的时候,则不妨切换成pnp法……
这样一来,就能兼顾效率与精准了。
破费!
最后还有一件事,那就是目标动作预测。
这是一个相当困难的问题,但也是一个非常重要的问题。
预测做得好不好,直接决定了子弹的命中率。
如果不做预测,当敌方车辆不断移动时,瞄准点将总是滞后于敌机的实际位置。
这当然是不可接受的。
所以必须做,而且还要尽可能地做到完美!
(iishu)是,,,,!
第331章 背着妈妈偷吃
【】(iishu),
想要预测目标的动作,最大的难点是坐标变换。
由于摄像头是安装在机体上的,当机身不动的时候,可以看做是第三视角。
这样,以自身机体为原点的坐标系,就可以看成和大地坐标系是等价的。
这种情况下,计算起来相对简单。
只需要通过图片识别,得到的敌机在大地坐标系中的坐标,就可以通过相邻两帧的时间差和位置差,计算出敌机的移动速度。
然后用速度x时间,就可以得到预测量,从而进行预测补偿操作了。
如果本机处于运动中,情况就要复杂得多了。
很多选手在这一步,都会退而求其次,采用近似算法,用自身机体的坐标系,来近似大地坐标系。
这当然也是可行的,因为实战之中,完全可以停下来再开枪。
而且当机体运动速度不快时,误差并不会大到无法接受。
但江寒并没有这么做,而是老老实实地写了一个坐标系变换函数。
当机体处于运动中时,自身坐标系和大地坐标系不再重合,想要得到准确的预测结果,就需要规定一个原点,比如场地的某个标志物,从而建立固定的坐标系。
然后再测出自身位移,再与之前从图片识别过程中计算出来的敌机位置和角度进行叠加变换,就能得到敌机在大地坐标系中的坐标了。
江寒刚弄到这里,一个20岁出头,清秀可人的女服务员,拎着外卖袋子走了过来。
“请问哪位是2602的客人?”小前台问。
猜你喜欢