zoukankan      html  css  js  c++  java
  • OpenCV VideoCapture获取设备ID和名称

    在做场景合并等情况下,需要用到两个或者两个以上的摄像头。虽然可以用一个简单的设置函数

    VideoCapture capture(int index);

    去设置相应的设备ID,但是这个需要你知道设备摄像头的ID号,虽然一般电脑自带的摄像头ID为0,不同的USB插口有不同的ID号,我还是遇到有些奇葩的电脑其摄像头ID的值不是0;

    所以还是觉得有必要去获取一下摄像头的ID号,以下的源代码是借鉴别人的,主要是从videocapture的源代码找到的。

      1 #include <opencv2/imgcodecs.hpp>
      2 #include <opencv2/highgui.hpp>
      3 #include "windows.h"
      4 #include "dshow.h"
      5 #include <iostream>
      6 
      7 #pragma comment(lib, "strmiids.lib")
      8 #pragma comment(lib, "quartz.lib")
      9 
     10 using namespace cv;
     11 using namespace std;
     12 
     13 int listDevices(vector<string>& list) {
     14 
     15     //COM Library Initialization
     16     //comInit();
     17 
     18     //if (!silent) DebugPrintOut("
    VIDEOINPUT SPY MODE!
    
    ");
     19 
     20 
     21     ICreateDevEnum *pDevEnum = NULL;
     22     IEnumMoniker *pEnum = NULL;
     23     int deviceCounter = 0;
     24     CoInitialize(NULL);
     25 
     26     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
     27         CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
     28         reinterpret_cast<void**>(&pDevEnum));
     29 
     30 
     31     if (SUCCEEDED(hr))
     32     {
     33         // Create an enumerator for the video capture category.
     34         hr = pDevEnum->CreateClassEnumerator(
     35             CLSID_VideoInputDeviceCategory,
     36             &pEnum, 0);
     37 
     38         if (hr == S_OK) {
     39 
     40             printf("SETUP: Looking For Capture Devices
    ");
     41             IMoniker *pMoniker = NULL;
     42 
     43             while (pEnum->Next(1, &pMoniker, NULL) == S_OK) {
     44 
     45                 IPropertyBag *pPropBag;
     46                 hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
     47                     (void**)(&pPropBag));
     48 
     49                 if (FAILED(hr)) {
     50                     pMoniker->Release();
     51                     continue;  // Skip this one, maybe the next one will work.
     52                 }
     53 
     54 
     55                 // Find the description or friendly name.
     56                 VARIANT varName;
     57                 VariantInit(&varName);
     58                 hr = pPropBag->Read(L"Description", &varName, 0);
     59 
     60                 if (FAILED(hr)) hr = pPropBag->Read(L"FriendlyName", &varName, 0);
     61 
     62                 if (SUCCEEDED(hr))
     63                 {
     64 
     65                     hr = pPropBag->Read(L"FriendlyName", &varName, 0);
     66 
     67                     int count = 0;
     68                     char tmp[255] = { 0 };
     69                     //int maxLen = sizeof(deviceNames[0]) / sizeof(deviceNames[0][0]) - 2;
     70                     while (varName.bstrVal[count] != 0x00 && count < 255)
     71                     {
     72                         tmp[count] = (char)varName.bstrVal[count];
     73                         count++;
     74                     }
     75                     list.push_back(tmp);
     76                     //deviceNames[deviceCounter][count] = 0;
     77 
     78                     //if (!silent) DebugPrintOut("SETUP: %i) %s
    ", deviceCounter, deviceNames[deviceCounter]);
     79                 }
     80 
     81                 pPropBag->Release();
     82                 pPropBag = NULL;
     83 
     84                 pMoniker->Release();
     85                 pMoniker = NULL;
     86 
     87                 deviceCounter++;
     88             }
     89 
     90             pDevEnum->Release();
     91             pDevEnum = NULL;
     92 
     93             pEnum->Release();
     94             pEnum = NULL;
     95         }
     96 
     97         //if (!silent) DebugPrintOut("SETUP: %i Device(s) found
    
    ", deviceCounter);
     98     }
     99 
    100     //comUnInit();
    101 
    102     return deviceCounter;
    103 }
    104 
    105 int main()
    106 {
    107     vector<string> list;
    108     listDevices(list);
    109     int capid0 = 0, capid1 = 0;
    110     cout << "dev_size =      " << list.size() << endl;
    111     for (int i = 0; i<list.size(); i++)
    112     {
    113         if (list[i] == "3D Camera")
    114             capid1 = i;
    115         if (list[i] == "USB2.0 HD UVC WebCam")
    116             capid0 = i;
    117         cout << "device lists:  " << list[i] <<"     i =   "<<i<< endl;
    118     }
    119     getchar();
    120     return 0;
    121 }

    opencv的环境不用说自己配置,还有两个系统库,需要额外的添加

    #pragma comment(lib, “strmiids.lib”)
    #pragma comment(lib, “quartz.lib”)

    测试运行的结果
    在这里插入图片描述

  • 相关阅读:
    终端提示符路径长度设置
    linux ssh服务器
    kail-linux my need
    elasticsearch的marvel
    VPS折腾
    Ubuntu 系统密码相关问题
    Pycharm 使用配置
    python集成开发工具
    Codeforces Round #554 (Div. 2) 选做
    Codeforces Forethought Future Cup Elimination Round 选做
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12522662.html
Copyright © 2011-2022 走看看