最近忙于处理摄像头测试的事,发现电脑连接多个同种USB视频设备时设备的名字都是一样的,GUID也是一样的,不能再像以前使用opencv通过名字直接打开摄像头采集图像,摆在眼前的是同台电脑如何同时打开多个摄像头同时进行测试呢?在网上搜了很多资料,也没找到相关的资料,没有相关的经验可以借鉴,或许有没有分享出来,只能摸着石头过河,硬着头皮探索。

通过比对计算机的设备管理器发现对应的设备属性之间有关位置信息存在差异(port,hub),思考是否可以通过这个差异区分出不同的视屏设备呢?

因此 朝着这个思路去寻找方法,通过opencv 写的demo打开摄像头是通过 VideoCapture capture = VideoCapture(camID);  当连接多个视频设备时,会枚举出所有视屏设备,代码如下(Vedioinput,directshow 都有介绍。):

int EnumDevices(CStringArray& listCamera)
{//枚举视频设备ICreateDevEnum *pCreateDevEnum;HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);if (hr != NOERROR)return -1;CComPtr<IEnumMoniker> pEm;hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);if (hr != NOERROR)return -1;pEm->Reset();int id = 0;ULONG cFetched;IMoniker *pM;while (hr = pEm->Next(1, &pM, &cFetched), hr == S_OK){IPropertyBag *pBag;hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pBag);if (SUCCEEDED(hr)){VARIANT var;CString tempstr;var.vt = VT_BSTR;hr = pBag->Read(L"FriendlyName", &var, NULL);if (hr == NOERROR){id++;LPWSTR* str = var.pbstrVal;listCamera.Add(var.bstrVal);SysFreeString(var.bstrVal);}pBag->Release();}pM->Release();}return id;
}

尝试更新VideoCapture capture = VideoCapture(camID);中的camID, 发现camID 跟枚举出来的视屏设备的顺序一致,打开的也是对应顺序的视频设备,因此猜想对应的设备ID就是对应枚举出来的顺序号(当然还可以根据对应的port 来控制不同的视频设备,不过后面没有尝试),后来也证明了这个猜想是对的。

解决了视频设备号的问题,可以这个只能打开了摄像头才知道打开的是对应哪个USB port 口的设备,如何想要打开连接哪个USB Port 口的就打开哪个port 口的设备呢?这就回到了开篇讲的设备位置信息。通过设备名称和设备位置信息绑定就知道到打开了哪个USB port口的对应视频设备, 上面的方法已经不适用了没有找到对应的属性,因此重新研究,参考文章如下:https://stackoverflow.com/questions/3438366/setupdigetdeviceproperty-usage-example。

void EnumDevices(vector<CString> &listCamera)
{CONST GUID *pClassGuid = NULL;CString strDevice_Friendly_Name, strDevice_Location_Info;unsigned i, j;DWORD dwSize, dwPropertyRegDataType;DEVPROPTYPE ulPropertyType;CONFIGRET status;HDEVINFO hDevInfo;SP_DEVINFO_DATA DeviceInfoData;const static LPCTSTR arPrefix[3] = { TEXT("VID_"), TEXT("PID_"), TEXT("MI_") };TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN];TCHAR szDesc[1024], szHardwareIDs[4096];WCHAR szBuffer[4096] = { 0 };LPTSTR pszToken, pszNextToken;TCHAR szVid[MAX_DEVICE_ID_LEN], szPid[MAX_DEVICE_ID_LEN], szMi[MAX_DEVICE_ID_LEN];USES_CONVERSION;Sleep(1000); //防止更新模组时,USB camera 没有识别// List all connected USB devices  hDevInfo = SetupDiGetClassDevs(pClassGuid, _T("USB"), NULL,pClassGuid != NULL ? DIGCF_PRESENT : DIGCF_ALLCLASSES | DIGCF_PRESENT);if (hDevInfo == INVALID_HANDLE_VALUE)return;// Find the ones that are driverless  for (i = 0; ; i++){DeviceInfoData.cbSize = sizeof(DeviceInfoData);if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData))break;status = CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_PATH, 0);if (status != CR_SUCCESS)continue;if (SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_BusReportedDeviceDesc,&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)){memset(szBuffer, 0, sizeof(WCHAR) * 4096);if (SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_FriendlyName,&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)){strDevice_Friendly_Name = szBuffer;}memset(szBuffer, 0, sizeof(WCHAR) * 4096);if (SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_LocationInfo,&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)){strDevice_Location_Info = szBuffer;}if (strDevice_Location_Info.Find(_T("0000.0014"), 0) != -1){CString TempStr;TempStr.Format(_T("%s-%s"), strDevice_Friendly_Name, strDevice_Location_Info);listCamera.push_back(TempStr);}}}return ;
}

至此完美收关,能够随心所欲打开所要打开的视频设备了。

一台电脑连接多个同种USB摄像头区分测试相关推荐

  1. 一台计算机连接两个投影,如何实现多台电脑连接一台投影仪并快速切换

    如何实现多台电脑连接一台投影仪并快速切换 多台电脑连接一台投影仪并快速切换这个需求其实在很早以前就被解决了,AWIND奇机无线投屏器可以让整个切换过程在3-5秒内完成.也就是投影机信号像电视机更换电视 ...

  2. 局域网视频共享 php,window_Windows 7媒体库管理音视频文件实现局域网共享, 任务分析 多台电脑连接的家 - phpStudy...

    任务分析 多台电脑连接的家庭网络已经越来越普遍了,家里的每个成员都想享受多媒体的乐趣,以"家"为单位的多媒体管理和共享就成为要解决的中心问题. 预设方案 用Windows 7的媒体 ...

  3. 同一局域网下,一台电脑连接另一台电脑的虚拟机(从属机(window)连接主机(window)虚拟机(Linux)的连接流程)

    同一局域网下,一台电脑连接另一台电脑的虚拟机(从属机(window)连接主机(window)虚拟机(Linux)的连接流程) 一. 通过NET网络模式连接 查看主机本身ip: win+r 输入cmd, ...

  4. 不同网络下 一台电脑连接另一台电脑的mysql数据库

    不同网络下 一台电脑连接另一台电脑的mysql数据库 首先确保,两台电脑都已经有了基本配置好的可用的mysql数据库 确定一台电脑为服务端,再服务端数据库下,先授权可被其他电脑访问: 如果MySQL是 ...

  5. 计算机联到同一个局域网,两台电脑连接同一个wifi算是局域网么

    两台电脑连接同一个wifi算是局域网么 卡饭网 本站整理 2019-01-25 查询是否属于同个局域网办法有: 简单易懂法: 打开网络邻居,查看工作组计算机,如果在里面能看到对方的计算机名称.那么两台 ...

  6. 远程控制软件如何实现两台电脑连接

    目前,笔记本电脑可以说在生活中起到了很大的作用,因为它携带很方便,可以随时随地工作,可以说起到了移动办公桥梁的作用.特别是现在远程办公慢慢的走进了人们的生活中,已经变成了一部分人生活的一部分,其实远程 ...

  7. mysql数据库 两台电脑连接,一台作为服务器

    mysql数据库 两台电脑连接,一台作为服务器 192.168.10.189作为项目启动服务器,需连接到192.168.10.190数据库服务器: 在192.168.10.190电脑做以下操作: 远程 ...

  8. windows10下两台电脑连接局域网怎么设置?

    windows10下两台电脑连接局域网怎么设置? 参考链接:https://www.sohu.com/a/433679217_120006554 1. 如图所示,点击网络图标,出现网络相关,然后点击& ...

  9. 微软服务器在电脑上怎么打开,怎么在一个电脑上开启服务器可以让另外一台电脑连接服...

    首先,我们还是登陆路由器的WEB管理界面,在WEB管理界面中,我们选择"IP带宽控制功能".需要注意的一点是,有的路由器并没有这项功能,需要您升级您的路由器固件,这样才可以进行下一 ...

最新文章

  1. django之全文检索
  2. 阿里的“扫地僧”,2年“抄”了20万页古籍
  3. 27. 代码实例-spring声明式事务
  4. 百度开发者中心全新升级 | 文末六一送福利
  5. boost::locale::generator用法的测试程序
  6. 象棋子 设计模式_通过设计国际象棋游戏了解策略模式
  7. python协成_Python协程(上)
  8. Go语言结构体的多字段赋值是并发安全的吗?
  9. 分享几个你可能不知道的交互式Git 命令
  10. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·001【数据库基本概念、MySQL安装与介绍】
  11. leetcode 1518 换酒问题
  12. 基于java+jsp的户籍管理系统
  13. 涉密计算机默认安全用户名,机密级涉密计算机的系统登录如采用用户名加口令的方式,则系统口令更换周期不得长于 - 作业在线问答...
  14. n平方的求和公式_1到N的平方和,立方和公式是怎么推导的?
  15. mysql怎么创建出生日期表_如何在MySQL中从出生日期开始生成数字序列
  16. Java UT用例实践记录
  17. Trunk链路的作用
  18. 三线制电阻内引线阻值测量
  19. 解决AJAX请求使PHP反应时间过长的问题
  20. 基于SSM的高校课程评价系统

热门文章

  1. 丁鹿学堂前端培训:ts+webpack打造自己的ts脚手架(二)
  2. 什么是Spring IoC 和 AOP?
  3. Exynos 4412启动流程分析
  4. 王者荣耀3月31日服务器维护,王者荣耀3月31日体验服停机更新公告 新增派对大作战玩法...
  5. 个人支付宝微信收款研究突破
  6. html学习:关于网页字体的设置
  7. 2022年摄影行业分析
  8. 【C语言】函数指针、函数指针数组、函数指针数组的指针
  9. 马云:各省女生罩杯情况我都知道,这就是大数据!
  10. 读取文件错误 OSError: [Errno 22] Invalid argument: