VID和PID

PID/VID唯一标识一个设备,HardwareID是为了给系统识别的 ,他是根据PID/VID而生成的。这个与序列号没什么关系,序列号一般都是厂家固化到芯片中的信息而已。GUID只是为了标志你安装的设备是属于一个什么类当中,这个类可以显示再设备管理器中。比如:你可以定义一个类,当然这个类有与系统中任何类都不同的GUID,然后选择一个图标和类名,就可以同网卡等其他设备一起显示在设备管理器下的根目录中了

根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的,PID由供应商自行决定,理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID,以便区别相同厂家的不同设备。

VID和PID通常情况下有两种存储方式,第一种是主控生产商的VID和PID,存储在主控的bootcode中;第二种是设备生产商的VID和PID,该VID和PID存储在主控外部的非易失性存储设备中(EEPROM或Flash)的设备固件中,当USB设备连接主机时,如果固件中有设备生产商的VID和PID,会将该VID和PID报告给主机,而忽略主控生产商的VID和PID。所以理论上一个USB存储设备的VID应该是设备生产商的VID,而不是主控生产商的VID,这两个VID应该是不同的(主控生产商自己生产的设备除外)。

由于VID和PID重复并不会对产品的使用带来严重影响,很多USB设备生产商(山寨厂居多)为了方便,并不会向USB执行论坛申请自己的VID,而是依然沿用主控生产商的VID或随便向产品写入VID和PID;同时,正规厂家只需要申请VID,PID由厂家自行确定,所以存在相同型号的产品,可能采用了不同的主控(商业需要,很正常),而他们的PID是一样的,基于上述原因通过VID和PID就不能准确识别USB设备的主控型号,这个问题大家在使用USB设备的过程中需要注意。

查看设备信息

1、鼠标右键“我的电脑”,选择“管理”,进入“计算机管理”。

2、在“计算机管理”界面,依次选择“设备管理器”、“图像设备”、摄像头的型号,选中点击鼠标右键,选择“属性”。

3、进入“属性”页面,就可已查看USB设备的VID和PID了。

获取摄像头型号

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include "windows.h"
#include "dshow.h"
#include <iostream>#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "quartz.lib")using namespace cv;
using namespace std;int listDevices(vector<string>& list)
{//COM Library Initialization//comInit();//if (!silent) DebugPrintOut("\nVIDEOINPUT SPY MODE!\n\n");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));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) {IPropertyBag *pPropBag;hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,(void**)(&pPropBag));if (FAILED(hr)) {pMoniker->Release();continue;  // Skip this one, maybe the next one will work.}// Find the description or friendly name.VARIANT varName;VariantInit(&varName);hr = pPropBag->Read(L"Description", &varName, 0);if (FAILED(hr)) hr = pPropBag->Read(L"FriendlyName", &varName, 0);if (SUCCEEDED(hr)){hr = pPropBag->Read(L"FriendlyName", &varName, 0);int count = 0;char tmp[255] = { 0 };//int maxLen = sizeof(deviceNames[0]) / sizeof(deviceNames[0][0]) - 2;while (varName.bstrVal[count] != 0x00 && count < 255){tmp[count] = (char)varName.bstrVal[count];count++;}list.push_back(tmp);//deviceNames[deviceCounter][count] = 0;//if (!silent) DebugPrintOut("SETUP: %i) %s\n", deviceCounter, deviceNames[deviceCounter]);}pPropBag->Release();pPropBag = NULL;pMoniker->Release();pMoniker = NULL;deviceCounter++;}pDevEnum->Release();pDevEnum = NULL;pEnum->Release();pEnum = NULL;}//if (!silent) DebugPrintOut("SETUP: %i Device(s) found\n\n", deviceCounter);}//comUnInit();return deviceCounter;
}int main()
{vector<string> list;int capid0 = 0, capid1 = 0;//摄像头IDint divice_num = 0;divice_num = listDevices(list);//设备列表cout << "divice_num:" << divice_num << endl;for (int i = 0; i < list.size(); i++){/*if (list[i] == "3D Camera"){capid1 = i;cout << list[i]<< " is 3D Camera"<<endl;}if (list[i] == "USB2.0 HD UVC WebCam"){capid0 = i;cout << list[i] << " is USB2.0 HD UVC WebCam" << endl;}*/cout << "Device["<<i<<"]:"<< list[i] << endl;}VideoCapture cap;cout << "capid= " << capid1 << endl;cap.open(capid1);Mat frame;while (1){cap >> frame;imshow("capshow", frame);if (waitKey(30) == 27){break;}}return 0;
}

获取设备的VID和PID

在使用多个摄像头的时候,如果使用同型号的摄像头,它们的VID和PID相同的。所以,依靠VID和PID不能区分同型号的摄像头,必须要知道设备的端口号,才可以确定调用的是哪个摄像头。

#include <iostream>
#include <windows.h>
#include <string>
#include <setupapi.h>#include <initguid.h>
using namespace std;#pragma comment(lib,"setupapi.lib")DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);//获取USB设备VID和PID
string GetUsbInfo()
{HDEVINFO hDevInfo;SP_DEVICE_INTERFACE_DATA spDevData;PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;BOOL bRes = TRUE;int nCount = 0;string csResult;hDevInfo = ::SetupDiGetClassDevs((LPGUID)&UsbClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);if (hDevInfo != INVALID_HANDLE_VALUE){pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, 1024);pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);while (bRes){spDevData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);bRes = ::SetupDiEnumDeviceInterfaces(hDevInfo, NULL, (LPGUID)&UsbClassGuid, nCount, &spDevData);if (bRes){bRes = ::SetupDiGetInterfaceDeviceDetail(hDevInfo, &spDevData, pDetail, 1024, NULL, NULL);if (bRes){string szStr = pDetail->DevicePath;csResult += szStr + "\n";nCount++;}}}::GlobalFree(pDetail);::SetupDiDestroyDeviceInfoList(hDevInfo);}return csResult;
}int main(void)
{string csStr = GetUsbInfo();cout << csStr << endl;system("PAUSE");return 0;
}

注意:以上代码均在VS2015上测试通过,如果出现字符错误,请更换为“多字节字符集”,再进行调试。

OpenCV:如何获取摄像头的型号以及USB设备的VID和PID信息?相关推荐

  1. USB设备的VID与PID

    一.VID和PID   PID/VID唯一标识一个设备,HardwareID是为了给系统识别的 ,他是根据PID/VID而生成的.这个与序列号没什么关系,序列号一般都是厂家固化到芯片中的信息而已.GU ...

  2. 浅谈USB设备的VID和PID

    亲测可用,若有疑问请私信 ​U盘的VID和PID分别是指Vendor ID(生产厂商ID) 和Product ID(产品ID). U盘的主控芯片决定了用什么量产工具.对于多数U盘来说,比如:金士顿.爱 ...

  3. linux 设备型号,根据USB设备硬件信息获取Android设备型号

    前些日子,自己接手专门为Android设备开发的数据恢复软件,第一次作为项目经理带队进行项目开发. 其中为了解决设备和型号的对应关系,用于区分当前接入系统的设备是USB设备,并且是Android设备而 ...

  4. C++获取所有USB接口的vid、pid等信息

    最近项目要写一个MFC的外挂程序,要分别获取电脑上所有扫描枪的输入信息,这时我们就需要根据扫描枪的vid和pid进行区分,有一些同批次同型号的输入设备vid和pid会相同,我们可能需要设备实例路径进行 ...

  5. WindowsLinux获取摄像头名称和默认麦克风设备名称

    1.Windows下根据摄像头VID&PID获取设备名称与获取默认麦克风设备名称 注意 :windows版本使用了video_capture.dll.和audio_sdk.dll两个库进行获取 ...

  6. UE4 UE5 opencv插件 获取摄像头画面

    本插件在UE4.26.UE4.27.UE5.0.3等版本亲测有效,谢谢各位前辈朋友,这里就不一一鸣谢了. 插件地址:UE5OpenCV插件-C++文档类资源-CSDN下载 1.项目配置 下载后解压到工 ...

  7. VMware连接摄像头的时候出现USB 设备Acer USB Composite Device解决办法

    如果是笔记本的话,先试试将鼠标插上去.先识别USB端口在说. 如果用Ubuntu连接摄像头的时候出现上图的情况,那么就是VMware的USB驱动没了, 现在需要的就是需要将VMware完全卸载.然后重 ...

  8. java获取usb设备的相关信息

    我从上上个礼拜开始接触,公司需要,所以开始在网上搜索相关资料,但是都没有找到合适的范例,但万幸终于测试出合适的代码. import java.io.UnsupportedEncodingExcepti ...

  9. 通过USB VID和PID卸载USB设备

    以前也发过一几篇关于卸载USB设备的文章,其实原理都是一样都是使用同一个API "CM_Request_Device_Eject_ExW"来完成卸载工作,上一篇是通过遍历USB接点 ...

最新文章

  1. VS+MFC+Opencv显示视频和图像。
  2. 谷歌发布深度学习新算法,适用于真实机器人的技能学习
  3. Windows Mobile获取SIM卡上的所有电话号码
  4. 图像传感器与信号处理——详解图像传感器噪声
  5. 免费的400GB网络存储空间
  6. 底部按钮吸附_知乎的药丸按钮(二)我的 iOS 实现
  7. C语言分支结构while,C语言学习:分支结构和循环结构的总结(收藏)
  8. pyinstaller 打包exe可执行文件
  9. 2013年上半年 系统分析师 论文 真题
  10. WPS简历模板的图标怎么修改_个人简历模板集锦,简历自我评价怎么写?
  11. Go语言在大数据时代应用前景
  12. 计算机科学与工程本科,加州大学洛杉矶分校计算机科学与工程本科申请条件.pdf...
  13. oeasy教您玩转linux010203显示logo
  14. 机器人时代 - 电子书下载(高清版PDF格式+EPUB格式)
  15. ERROR: [Synth 8-439] module ‘xxx‘ not found not found 错误解决办法
  16. _ViewStart.cshtml介绍
  17. 【王道考研】吸烟者问题
  18. 老虎证券登陆纳斯达克,CEO巫天华:创业要恪守自己的能力圈...
  19. linux命令行编译pascal,【教程】 如何在linux/mac下安装pascal
  20. gprMax项目代码分解:gprMax.py

热门文章

  1. 图纸加密模块介绍(主模块)
  2. 机器人3D视觉引导技术,助力“中国制造2025”
  3. python新手代码
  4. flash游戏引擎整理
  5. JavaScript屏幕保护网页js特效代码
  6. 【MySQL功法】第2话 · 数据库与数据表的基本操作
  7. 150ms流畅体验 NBA2KOnline如何网络同步优化
  8. nodejs使用redis.js并进行封装,实现数据存取
  9. 如何成为非标行业的大拿
  10. Windows引导过程