上一篇: C语言画圣诞树源码(树界降临)
逐梦编程,让中华屹立世界之巅。
简单的事情重复做,重复的事情用心做,用心的事情坚持做;
在实际开发中,涉及到硬件开发的时候,可能会有摄像头模块,大部分人能想到的第一印象基本上OpenCV调用摄像头获取信息,但是本文并不采用第三方库OpenCV来实现,
以实战C++调用捕获系统所有接入的摄像头下标ID与名称;
windows10在桌面图标我的电脑,鼠标右键点击属性,进入以下所示;
点击设备管理器,点开照相机或者摄像头(每个电脑的名称大同小异),
代码如下(示例):
/*-----------------------------------【程序说明】----------------------------
* 项目命题: 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;
}
以上就是今天要讲的内容,有兴趣的初学者也可以研究一些硬件相关的软件,文末了,喜欢的道友们帮忙点个赞和收藏,谢谢!