zoukankan      html  css  js  c++  java
  • 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;
    }

     ===================运行效果===============

     代码复制粘贴即可运行

  • 相关阅读:
    js设置滚动条定位到所属容器的最底部
    js如何获取前后连续n天的时间
    vue实现点击区域外部的区域,关闭该区域
    使用typed.js实现页面上的写字功能
    Python3基础 函数 多值参数 元组与字典形式(键值对分别指出)
    Python3基础 函数 返回值 利用元组返回多个值
    Python3基础 变量命名 区分大小写
    Python3基础 函数 参数为list可变类型时,使用append会影响到外部实参
    Python3基础 函数 多值参数 元组与字典形式(使用星号对列表与字典进行拆包)
    Python3基础 函数 参数 多个参数都有缺省值,需要指定参数进行赋值
  • 原文地址:https://www.cnblogs.com/herd/p/9277402.html
Copyright © 2011-2022 走看看