zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

动态获取奥比UVC设备索引号的方法

设备方法索引 获取 动态
2023-09-27 14:25:47 时间

问题:获取UVC流的方式有多种,openCV或者DShow,WMF等。

而通过openCV的方式比较常用,但是采用opencv接口获取UVC流时,采用的索引号的方式。在连接了多个不同UVC设备时,系统的索引号不一样,能否动态的获取到奥比的UVC流?

解决办法:

利用奥比的usb的vid,利用DShow枚举设备,获取到的vid跟奥比设备比较,相同就记录下设备的索引号。再利用openCV打开UVC流。

注意:该种处理办法,在连接多个奥比UVC设备时,无效。目前没有找到绑定RGB模组和depth模组绑定的方法。

枚举UVC设备,并检测奥比RGB模组,返回索引号截图如下:

int GetOrbUvcDevIdx(void)
{
 ICreateDevEnum *pDevEnum = NULL;
 IEnumMoniker *pEnum = NULL;
 int deviceCounter = 0;
 CoInitialize(NULL);
 HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
 CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
 reinterpret_cast<void**>(&pDevEnum));
 int idx = -1;
 int flagi= -1;
 if (SUCCEEDED(hr))
 {
 // Create an enumerator for the video capture category.
 hr = pDevEnum->CreateClassEnumerator(
 CLSID_VideoInputDeviceCategory,
 &pEnum, 0);
 if (hr == S_OK)
 {
 //printf("SETUP: Looking For Capture Devices\n");
 IMoniker *pMoniker = NULL;
 while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
 {
 //get device idx
 flagi++;
 TCHAR szBuf[512];
 WCHAR *wszDisplayName = NULL;
 if (SUCCEEDED(pMoniker->GetDisplayName(0, 0, &wszDisplayName)))
 {
 if (wszDisplayName)
 {
 wcscpy(szBuf, wszDisplayName);
 CoTaskMemFree(wszDisplayName);
 if (wcsstr(szBuf, L"vid_2bc5"))
 {
 //printf("------find 2bc5\n");
 idx = flagi;
 }
 //wprintf(L"%s\n", szBuf);
 }
 }
 pMoniker->Release();
 pMoniker = NULL;
 deviceCounter++;
 }
 pDevEnum->Release();
 pDevEnum = NULL;
 pEnum->Release();
 pEnum = NULL;
 }
 }
 return idx;
}

备注:
点击下面链接,进入奥比中光开发者社区,了解更多3D视觉技术信息:
https://developer.orbbec.com.cn/

或扫描下方二维码,进入奥比中光开发者社区:
在这里插入图片描述