C++捕获系统摄像头下标ID与名称(非OpenCV版本)

上一篇: C语言画圣诞树源码(树界降临)

逐梦编程,让中华屹立世界之巅。
简单的事情重复做,重复的事情用心做,用心的事情坚持做;


文章目录

  • 前言
  • 一、如何查看摄像头的下标与名称
  • 二、实战代码
  • 总结
  • 新壁纸


前言

在实际开发中,涉及到硬件开发的时候,可能会有摄像头模块,大部分人能想到的第一印象基本上OpenCV调用摄像头获取信息,但是本文并不采用第三方库OpenCV来实现,

以实战C++调用捕获系统所有接入的摄像头下标ID与名称;


一、如何查看摄像头的下标与名称

windows10在桌面图标我的电脑,鼠标右键点击属性,进入以下所示;
C++捕获系统摄像头下标ID与名称(非OpenCV版本)_第1张图片
点击设备管理器,点开照相机或者摄像头(每个电脑的名称大同小异),
C++捕获系统摄像头下标ID与名称(非OpenCV版本)_第2张图片

二、实战代码

代码如下(示例):

/*-----------------------------------【程序说明】----------------------------
*			 项目命题:   C++捕获系统摄像头下标ID与名称(非OpenCV版本)
* 			 代码所属:   枫之剑客
* 			     作者:   阿甘
* 		     开发时间:   2019/06/18
*			IDE 版 本:   Visual Studio 2015
*		     项目版本:   1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx/article/details/128296570

#include
#include
#include
#include 

#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 CameraDevices(vector<string>& devlist)
{
    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++;
                   }
                   devlist.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> CName;//存储摄像头名称
    int num = CameraDevices(CName);
    cout << "摄像头个数:" << num << endl;
    for (int i = 0; i < num; i++) 
    {
        cout << " ID: " << i << " : " << " Name: " << CName[i] << endl;
    }
    printf("成功来之不易,同志还需努力!\n");
    system("pause");
    return 0;
}

总结

以上就是今天要讲的内容,有兴趣的初学者也可以研究一些硬件相关的软件,文末了,喜欢的道友们帮忙点个赞和收藏,谢谢!

新壁纸

C++捕获系统摄像头下标ID与名称(非OpenCV版本)_第3张图片

你可能感兴趣的:(项目实战合集,c++,opencv,开发语言,c语言,后端)