C++获取电脑上连接的多个摄像头名称与编号
#include<iostream>
#include "strmif.h"
#include <initguid.h>
#include<vector>
#include<string>
#pragma comment(lib, "setupapi.lib")
using namespace std;
#define VI_MAX_CAMERAS 20
DEFINE_GUID(CLSID_SystemDeviceEnum, 0x62be5d10, 0x60eb, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
DEFINE_GUID(CLSID_VideoInputDeviceCategory, 0x860bb310, 0x5d01, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
DEFINE_GUID(IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
//列出硬件设备
int listDevices(vector<string>& 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))
{
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum, 0);
if (hr == S_OK){
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.
}
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 };
while (varName.bstrVal[count] != 0x00 && count < 255)
{
tmp[count] = (char)varName.bstrVal[count];
count++;
}
list.push_back(tmp);
}
pPropBag->Release();
pPropBag = NULL;
pMoniker->Release();
pMoniker = NULL;
deviceCounter++;
}
pDevEnum->Release();
pDevEnum = NULL;
pEnum->Release();
pEnum = NULL;
}
}
return deviceCounter;
}
int main()
{
vector<string> CameraName;//存储摄像头名称
int num = listDevices(CameraName);
cout << "摄像头个数:" << num << endl;
for (int i = 0; i < num; i++) {
cout << " ID: "<< i << " : " << " Name: "<<CameraName[i] << endl;
}
//waitKey(0);
system("pause");
return 0;
}
===================运行效果===============
代码复制粘贴即可运行
最新文章
- javascript运动系列第四篇——抖动
- FMS 4中multicast脚本的小修正
- 背水一战 Windows 10 (1) - C# 6.0 新特性
- mysql动态行转列
- js获取url参数值(HTML之间传值)
- Eclipse安装jad插件进行反编译
- PostgreSQL的 fdw 跨库使用
- js 拼接 三列做为一行
- window程序设计1
- AFNetworking实现 断点续传
- 多线程并发 synchronized对象锁的控制与优化
- HostingEnvironment RegisterObject和QueueBackgroundWorkItem
- 使用PHP实现文件上传和多文件上传
- winform连接oracle时Oracle.DataAccess.dll版本问题
- django-个人博客登录及权限验证功能的实现
- Linux常用命令之链接命令和权限管理命令
- jQuery相关用法
- 用pymysql操作MySQL数据库
- 动态赋id
- Ren&#39;Py视觉小说安装,玩一下吧,上班很闲的话
热门文章
- web版源码管理软件SCM-Manager使用简要说明
- Codeforces Round #254(div2)B
- 用Java实现异构数据库的高效通用分页查询功能
- C#进阶之路(一):委托
- [BZOJ4573][ZJOI2016]大♂森林
- 消息队列mq总结(重点看,比较了主流消息队列框架)
- XSS与CSRF攻击
- Azure Blob存储更改缓存时间
- JDK 8 - java.util.HashSet 实现机制分析
- JVM插码之四:Java动态代理机制的对比(JDK 和CGLIB,Javassist,ASM)