简要说明一下情况:
已经有几个月没有再搞这个项目了,深度相机当时是借的,很久之前已经还回去了,以后有机会再继续研究,今天来做一个简单的收尾总结(其实很早就想写了,只是一直拖延到现在)。
一、报错杂记
1.安装openni时遇到的问题。
在执行安装依赖命令:sudo apt-get install libudev-dev
时,遇到如下报错:
dpkg: error processing package initramfs-tools (–configure)
——配置initramfs-tools包时,dpkg遇到了问题。
查到的解决办法有:
①先清理破损包,然后xxxxx,但就在清理破损包的这步sudo dpkg --configure -a
报了类似的错误(未走通)。
②手动清理,参考这篇(这个应该是走通了的)。
2.⭐【未解决】运行代码时报错:openni.utils.OpenNIError: (OniStatus.ONI_STATUS_ERROR, b’DeviceOpen using default: no devices found’, None)
这块就是我用openni一直卡住的原因,首先设备肯定是连接好的,那么我想就是openni安装有问题,但是我并没有找到符合【树莓派+Ubuntu18.04】的安装教程(网上大多Windows),按照Linux的安装方法时,中间总是会遇到一些其他错误,且搜索后未解决,当然我并不是网上方法全试过,有些比较复杂(在此过程中也会遇到新的报错),我比较懒就没试下去了。
其实有点小后悔当时没有把这里遇到的问题细细记录下来,现在有点记不清了,我只能根据那段时间写的日报浅浅回忆一下:
深度相机卖家跟我说,树莓派是arm架构的处理器,而我下载的openni驱动文件是Linux x86的,二者并不对应,于是我重新下载了openni包,但依旧没有通关,现在细讲一下:
①按官方教程,下载完openni的工具包,运行“sudo ./install.sh”安装规则文件,会自动生成一个OpenNIDevEnvironment(环境配置脚本),但是我这边并没有生成。【我记得之前用x86架构的工具包,运行完./install.sh后是有OpenNIDevEnvironment的】
②网上搜索no device found报错,大多数人出错都是因为没有把库文件和配置文件放到相应的位置里,即“python文件”中,这里我不太理解,它是指放在运行.py的目录下,还是整个python环境目录下,前者我试了,未解决,后者我试了个大概,我放到python3下试了,但没放python3.7下试过,系统上多个python环境之前就搞得我很迷糊,现在也不太清楚具体该放哪。
之后我又尝试给python3.7的site-package里导入openni的配置和库文件,但报错依旧不变,另外还发现一件事,我用终端命令查看的openni版本和我安装的openni文件不是同一个版本,我树莓派上安装的这个镜像好像本来就有某个openni版本,是小车例程里的,然后就很乱,之后我就放弃使用openni,改用pyorbbecsdk了。
【这里顺带记下配环境变量的步骤(几个月前写的):
sudo ./install.sh
sudo chmod -R 777 install.sh
cat OpenNIDevEnvironment >> ~/.bashrc
source ~/.bashrc
(咦,为什么截图上是x64???)
】
3.SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xa3 in position 1: invalid start byte
报错解释:
Python解释器在尝试使用UTF-8编码解码一个字节序列时遇到了无法解码的字节(0xa3)。这通常发生在读取文件或处理字符串时,文件或字符串包含无法用UTF-8编码表示的字符。
解决参考这篇,我的具体做法是:
在出错文件最上面添加:
#-*- coding : utf-8-*-
# coding:unicode_escape
这里再记录一个问题就是,我加上这两行之后,扫描遇到“\”好像直接给我换行了,然后报语法错误。
4.yolov5不同版本时更改问题:
utils.datasets→utils.dataloaders
scale_coords→scale_boxes
……(这个记得可能不完全,感觉像是记一半就没再继续了)
二、整体思路
我自己总结出来的深度相机获取深度信息的四种方法(python):
①opencv②openni③pyorbbecsdk④ros
四条路我都尝试并衡量过,最终选择了pyorbbecsdk。
安装包及安装教程见奥比中光AI开放平台(openni也是在这找的)。
1.pyorbbecsdk
安装pyorbbecsdk遇到的主要问题是:在按照教程执行到“make -j4”时,构建到100%时报错,我大概理解了一下报错提示:
编译某些python扩展时,需要用到-fPIC编译器选项,但现在系统默认(或者是设置成了)静态链接第三库进行编译,而此库编译时并未用到-fPIC选项。【虽然大家的错误原因都是比较统一的,但大家给出的解决办法却都不一样,我看到的都挨个试了一遍,没有用。】
最终是怎么解决的:报错时用的包是从上链接中直接下载的(可能没更新),最后换成了从GitHub中导的pyorbbecsdk包(两个包名字内容基本一模一样),就好了。
2.结合yolov5对检测物体测距
安装好pyorbbecsdk后,里面有许多示例程序,其中就有获取深度图及中心点距离的代码。
后续就是代码的相关调整了,但是我对yolov5代码不熟悉,或者说没有到那种能够熟练使用的地步,结合获取深度信息的代码时也就总有问题,后面跑通了代码,但是这个距离信息不太准确emmm,甚至可以说是错误的,中间出现的报错我就不一一细说了,因为是我自己瞎调才出现的,这里每个人的报错可能都不一样,说出来可能没有什么太大的参考价值(其实就是懒得把它们再列举总结出来了)。
说一下我的大体结合思路(只是我的!有可能不对!谨慎参考!):
①深度信息的获取:深度相机在采集完图像时就已经计算出了每个点的深度信息,存储在一个数组中,我们想要获得哪个点的深度信息,只需要将该点坐标作为参数调用深度数组的函数就行,比如说获取中心点距离:
②yolov5目标检测:代码前面的模型加载、预处理、推理和后处理什么的我都没有动,yolov5还是一如往常地对图像进行了目标检测,但是在它要一个个地(循环)输出结果,即画框和标注类型时,我们把当前目标的中心点坐标计算出来,传给获取深度的函数,从而获得深度值,然后把它放在类别后面一起输出。
部分代码:【参考了一些博客内容,但是时间过去太久有点找不到是哪篇了抱歉🙏🙏🙏】
#计算目标框中心点坐标
p1, p2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))
center_x = int((p2[0] - p1[0]) / 2 + p1[0])
center_y = int((p2[1] - p1[1]) / 2 + p1[1])
#获取深度值
depth = depth_data[center_y, center_x]
c = int(cls) # integer class
#设置标签显示
label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f} {depth}mm')
③如果以后有机会继续完成这个项目,将要关注的地方是:yolov5实时检测和深度相机实时获取深度图(信息)是否同步(同频),是否需要让深度相机的深度图像与彩色图像进行对齐,又具体是哪种对齐。
——————————完!!!——————————
【我有时翻一些博主的文章,看的时候总觉得读不懂意思,感觉前后文没有很清晰的逻辑,然后我刚才回看自己几个月前写的博客,哈哈哈哈哈出现了同样的情况,我感觉前一句和后一句接得莫名其妙的,以后我还会更新,但是内容就是别的了,我会尽量注意表达问题,至少不能让以后的自己看不懂。】
感谢阅读!