C++跟C#获取电脑上连接的多个摄像头名称与编号

1、其中C++获取多个摄像头的名称,然后根据名称对应其编号,从而可以使用opencv进行按编号打开特定的摄像头:

#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;
}

注意:经过多次测试,其获取相机的顺序跟opencv打开相机确定的顺序应当是一样的。

2、C#只能通过AForge.dll来获取摄像头信息,但是其存储相机的顺序跟opencv打开相机的顺序是不一样的。只能通过AForge.dll获取相机信息,并通过其获取的相机名称来打开相机。

1、检测电脑上的摄像头设备

#其中这个变量存储相机信息不是按照opencv打开相机的顺序存储的
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
//选择下拉框中的一个摄像头设备,其中MonikerString是对应相机的名称,
 VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString);

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c在计算机科学领域有着多种不同含义和用途。下面是一些常见的用法: 1. C编程语言:C是一种通用的高级编程语言,由贝尔实验室的Dennis Ritchie于20世纪70年代开发。C语言被广泛用于系统软件、嵌入式系统和应用程序的开发。它具有简洁的语法和强大的表达能力,可以直接访问计算机硬件和操作系统。 2. C++编程语言:C++是在C语言基础上发展而来的一种面向对象的编程语言。它包含了C语言的所有特性,并添加了类、继承、多态等面向对象的概念和机制。C++广泛应用于软件开发、游戏开发、图形图像处理等领域。 3. C#编程语言:C#是一种由微软开发的面向对象的编程语言。它结合了C++和Java的特点,具有易学易用的特点。C#被广泛应用于Windows应用程序、Web开发、游戏开发等领域。 4. C语言规范:C语言的语法和语义由国际标准化组织(ISO)发布的《C语言规范》定义。这个规范描述了C语言的语法、语义和标准库等方面的要求,为C语言的实现提供了参考。 总之,C在计算机科学领域起到了非常重要的作用,涉及了多个编程语言和规范,为软件开发和计算机系统设计提供了基础。 ### 回答2: c是大写字母的第三个字母,也是英文字母表中的一个字母。它有时被用作表示摄氏度的符号,表示温度的单位。c也可以表示一百,是罗马数字中的一个代表数。此外,c还可以表示光速,即光在真空中的传播速度,其数值约为每秒299,792,458米。光速是宇宙中最快的速度,在相对论物理学中有重要的作用。c还可以表示某个特定的常数,如普朗克常数、光速常数等。在计算机科学中,c通常表示编程语言C,它是一种广泛应用的编程语言,用于开发各种类型的软件和程序。C语言具有高效性和灵活性,是编程初学者学习的一种重要基础语言。总的来说,c在不同的领域中具有多种不同的含义和用途,它是字母表中的一个字母,代表数值、单位、常数和编程语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值