日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一台电脑同时连接多个相同的USB摄像头并根据USB口进行区分

發布時間:2024/3/24 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一台电脑同时连接多个相同的USB摄像头并根据USB口进行区分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一臺電腦同時連接多個相同的USB攝像頭并根據USB口進行區分

百度搜了下,

https://blog.csdn.net/kingston110/article/details/112060113?spm=1001.2014.3001.5506

這位老哥給的方案最靠譜,但是這老哥貌似有點保留,根據他的代碼是沒辦法對相同攝像頭by不同的USB口進行區分。

最后小研究了下找到解決方案。

1.OPENCV中打開攝像頭都是打開攝像頭的Index,這個Index是通過COM來遍歷“CLSID_VideoInputDeviceCategory”,這里可以查詢到不同Index的“DevicePath”。

比如:

Index: 0->"\\?\usb#vid_xxxx&pid_xxxx&mi_00#6&53e1f6&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"

這里用“#”作為字符串的分割點,取出“6&53e1f6&0&0000”作為后面USB端口比較的字符串

代碼:

int listDevices(std::map<std::string,int>& list) {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){IMoniker *pMoniker = NULL;int iCamID = 0;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"DevicePath", &varName, 0);if (SUCCEEDED(hr)){_bstr_t bstr(varName);std::string strtmp = bstr;std::vector<std::string> listtmp;tool_StringA::split(strtmp, listtmp, '#');strtmp = listtmp[2];std::transform(strtmp.begin(), strtmp.end(), strtmp.begin(), ::tolower);list.emplace(strtmp,iCamID++);printf("ID:%d - %s\n", iCamID - 1, strtmp.c_str());}pPropBag->Release();pPropBag = NULL;pMoniker->Release();pMoniker = NULL;deviceCounter++;}pDevEnum->Release();pDevEnum = NULL;pEnum->Release();pEnum = NULL;}//if (!silent)printf("SETUP: %i Device(s) found\n\n", deviceCounter);}//comUnInit();return deviceCounter; }

2. 根據USB口找到上面對應的信息:

這個位置可以通過SetupDiGetDevicePropertyW這個API 傳入DEVPKEY_Device_LocationInfo得到,

對應的信息如下:

“USB\VID_xxxx&PID_xxxx&MI_00\6&53e1f6&0&0000”->"0000.0014.0000.005.000.000.000.000.000"

“USB\VID_xxxx&PID_xxxx&MI_00\6&53e1f6&0&0000”分割‘\\’,得到"6&53e1f6&0&0000",和上面取到的信息一樣,當然大小寫不一樣需要轉換下。

這段代碼如下:

void EnumDevices(std::map<std::string, std::string> &listCamera) {CONST GUID *pClassGuid = NULL;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];// List all connected USB devices hDevInfo = SetupDiGetClassDevs(pClassGuid, ("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++){std::wstring strDevice_Friendly_Name, strDevice_Location_Info;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;}std::string Location, FriendlyName;//Location = Cto_string(strDevice_Location_Info);//FriendlyName = Cto_string(strDevice_Friendly_Name);Unicode2ANSI(strDevice_Location_Info, Location);Unicode2ANSI(strDevice_Friendly_Name, FriendlyName);std::string::size_type pos = Location.find("0000.0014");if (pos != std::string::npos){pos = FriendlyName.find("Camera");if (pos != std::string::npos){std::string strtmp = szDeviceInstanceID;std::vector<std::string> listtmp;tool_StringA::split(strtmp, listtmp, '\\');strtmp = listtmp[2];std::transform(strtmp.begin(), strtmp.end(), strtmp.begin(), ::tolower);listCamera.emplace(Location, strtmp);printf("%s - %s\n", strtmp.c_str(), Location.c_str());}}}} }

這樣基本就可以了,可以把需要區分的usb端口號“0000.0014.0000.006.000.000.000.000”寫入你的配置文件中即可~

std::map<std::string, int> camIDlist; listDevices(camIDlist);inih::INIReader r = inih::INIReader{ "./setting.ini" };const auto& v3 = r.Get<std::string>("Setting", "CamUSBPortLocation");std::map<std::string, std::string> camList; EnumDevices(camList);auto pos = camList.find(v3);decltype (pos->second) strDeviceID;if (pos != camList.end()){bFind = true;strDeviceID = pos->second;}else{printf("沒有找到Setting.ini對應的USB攝像頭!\n");return 0;}auto itFind = camIDlist.find(strDeviceID);if (itFind!=camIDlist.end()){iCamID = itFind->second;}else{printf("沒有找到對應的USB攝像頭!\n");return 0;}

?

?

總結

以上是生活随笔為你收集整理的一台电脑同时连接多个相同的USB摄像头并根据USB口进行区分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美激情一区二区三级高清视频 | 欧美xxx视频| 欧美精品中文 | 无码人妻一区二区三区免费n鬼沢 | 欧美性视频网站 | 亚洲第一视频 | 伊人久久麻豆 | 日本a级片网站 | 91蝌蚪视频在线观看 | 亚洲阿v天堂 | 国产古装艳史毛片hd | 99色在线视频 | 久久中文字幕国产 | 欧美日韩看片 | 国产情侣在线视频 | 精品国产av鲁一鲁一区 | 亚洲h网站 | 亚洲福利网 | 一起操网址 | 91天天操 | 视频一区二区在线播放 | 亚洲午夜在线视频 | av激情四射| 亚洲素人在线 | 青娱乐免费在线视频 | 小sao货大ji巴cao死你 | 日本网站在线播放 | 爱爱视频日本 | 男女日屁视频 | 欧美亚洲二区 | 欧美日韩精品区 | 日韩h在线观看 | 最新国产露脸在线观看 | 青青艹av| 公侵犯人妻中文字慕一区二区 | 国产成人久久精品流白浆 | 中国少妇无码专区 | 亚洲午夜一区二区 | 性xxx欧美| 天堂va欧美ⅴa亚洲va一国产 | 亚洲巨乳av | 久久精品一本 | 国产午夜一区 | 丰满人妻一区二区三区53号 | 6080午夜伦理 | 免费在线观看成年人视频 | 手机av免费看 | 五月天激情视频在线观看 | 少妇又白又嫩又色又粗 | 国产精品秘 | 国产欧美一区二区三区在线看蜜臂 | 极品色综合 | 岛国av免费 | 丝袜国产一区 | 日韩福利视频网 | 5月婷婷6月丁香 | 欧美视频免费在线观看 | 麻豆videos| 日韩作爱视频 | 天天操天天操天天操天天 | 日日干夜夜操 | 精品偷拍一区 | 欧美一区二区三区婷婷月色 | 亚洲欧美自偷自拍 | 九一av | 天天操夜夜添 | 琪琪免费视频 | 亚洲日本久久久 | 精品国产丝袜一区二区三区乱码 | 男人的天堂一区二区 | 亚洲天堂av中文字幕 | 国产精品你懂的 | av黄色网址| 国内精品一区二区 | 国产福利午夜 | 91精产国品 | 国产一区视频观看 | 国产av天堂无码一区二区三区 | 国产精品一区二区无码对白 | 激情小说在线 | 色综合中文网 | 天天看天天干 | 天堂在线视频免费观看 | 欧美丰满美乳xxx高潮www | 可以看的毛片 | 久久精品丝袜 | 久久久久久久久久国产精品 | 伊人91在线 | 999超碰 | 日日射日日干 | 欧美在线视频一区二区三区 | 四虎影院永久地址 | 色哟哟一区二区三区 | 香蕉伊人 | 欧美一区二区三区视频在线观看 | www.xxx亚洲| 日日干夜夜干 | 91色伦| 成人福利在线 |