windows下给定多个openNi的Uri,匹配与uri对应的Uvc RGB设备

1、问题描述:
在瀚维医疗项目中,客户给定两台deeyea(OpenNi+Uvc)设备,在windows平台下分别固定在不同的usb端口上,同时给定了两个设备的uri,默认给定的第一个设备的uri为左摄像头path,第二个设备的uri为右摄像头path。客户要求分别开启两台设备并捕捉RGB图片及计算点云并标明RGB图片及点云数据是由哪台deeyea设备产生的。
2、问题分析:
在windows平台上,常用的打开Uvc设备的SDK无非是opencv及directshow,但无论是哪种SDK,打开Uvc摄像头时传入的都是摄像头的索引序号index,而该index会随着插入端口的不同及插入时间的不同而不同。这就造成了第一次打开左摄像头时与OpenNI匹配的Uvc设备的index可能是0,得到了正确的结果;但是当重新插拔之后,与Openni设备匹配的Uvc设备的index就变化成了1,这时若还是去打开0号Uvc设备,打开的就可能是右摄像头的RGB,这就造成了输出的点云数据和RGB不匹配。实际上可能第一次打开设备时就已经造成了数据不匹配。
3、解决办法:
我的设想是既然用户已经固定了设备插入的端口,那么只需考虑插拔顺序对Uvc Index造成的影响即可。
最终的方案是:
①通过openni设备的uri找到对应的hub,uvc设备肯定也在该hub下,这样就能找到uvc设备;
②然后再找到uvc的device id
③之后再通过driectshow枚举uvc摄像头,因为使用opencv,底层打开设备实际调用也是driectshow,之后用找到的uvc的device ID或者Device Path去匹配driectshow枚举到的uvc摄像头,必定能找到一个,之后就能知道这个uvc设备在枚举的所有uvc摄像头中的序号(通过阅读opencv源码,保证枚举摄像头的顺序和opencv中枚举摄像头的顺序一致),继而就能通过videocapture.open(序号)的方式打开,也就区分了左右。
4、方案实现
通过查看usbtreeview工具源码(源码链接:https://github.com/chebotarevmichael/MSDNusbview )找到了①,②的方法:
代码如下:
①枚举所有Usb设备(以下代码通过阅读usbtreeview源码得来)
在这里插入图片描述
在这里插入图片描述
②枚举所有hub及port
枚举hub:
在这里插入图片描述
枚举hub下的port并记录信息:
在这里插入图片描述
在这里插入图片描述
③枚举uvc的DeviceID,以下代码通过阅读opencv源码得来
在这里插入图片描述
④匹配Uvc DeviceID和OpenNi uri并传出uvc对应的index.
在这里插入图片描述
在这里插入图片描述
到此,就获取到了通过OpenNi Uri得到对应的Uvc Index,继而就能打开与Uri匹配的Uvc摄像头。

备注:
点击下面链接,进入奥比中光开发者社区,了解更多3D视觉技术信息:https://developer.orbbec.com.cn/
或扫描下方二维码,进入奥比中光开发者社区:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/limingmin2020/article/details/120566155#comments_22219713
RGB
URI
今日推荐