OpenCV的VideoCapture是一个视频读取与解码的API接口,支持各种视频格式、网络视频流、摄像头读取。

针对一般摄像头的读取,opencv为了实现跨平台读取摄像头时是使用的摄像头索引,

 VideoCapture capture(int index);

一般而言电脑自带的摄像头id=0,但是也存在一些特殊情况,有些usb的摄像头接入笔记本后,usb摄像头的id会变位0,原有的笔记本id则变为1,所以为了程序的稳定性,最好还是使用图像采集设备的名称获取对应的id最后在使用opencv接口打开对应的设备(摄像头、视频采集卡...)。

 #include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include "windows.h"
#include "dshow.h"
#include <iostream> #pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "quartz.lib") using namespace cv;
using namespace std; int listDevices(vector<string>& list) { //COM Library Initialization
//comInit(); ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
int deviceCounter = ;
CoInitialize(NULL); HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
reinterpret_cast<void**>(&pDevEnum)); if (SUCCEEDED(hr))
{
// Create an enumerator for the video capture category.
hr = pDevEnum->CreateClassEnumerator(
CLSID_VideoInputDeviceCategory,
&pEnum, ); if (hr == S_OK) { printf("SETUP: Looking For Capture Devices\n");
IMoniker *pMoniker = NULL; while (pEnum->Next(, &pMoniker, NULL) == S_OK) { IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(, , IID_IPropertyBag,
(void**)(&pPropBag)); if (FAILED(hr)) {
pMoniker->Release();
continue; // Skip this one, maybe the next one will work.
} // Find the description or friendly name.
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"Description", &varName, ); if (FAILED(hr)) hr = pPropBag->Read(L"FriendlyName", &varName, ); if (SUCCEEDED(hr))
{ hr = pPropBag->Read(L"FriendlyName", &varName, ); int count = ;
char tmp[] = { };
//int maxLen = sizeof(deviceNames[0]) / sizeof(deviceNames[0][0]) - 2;
while (varName.bstrVal[count] != 0x00 && count < )
{
tmp[count] = (char)varName.bstrVal[count];
count++;
}
list.push_back(tmp);
//deviceNames[deviceCounter][count] = 0; //if (!silent) DebugPrintOut("SETUP: %i) %s\n", deviceCounter, deviceNames[deviceCounter]);
} pPropBag->Release();
pPropBag = NULL; pMoniker->Release();
pMoniker = NULL; deviceCounter++;
} pDevEnum->Release();
pDevEnum = NULL; pEnum->Release();
pEnum = NULL;
} //if (!silent) DebugPrintOut("SETUP: %i Device(s) found\n\n", deviceCounter);
} //comUnInit(); return deviceCounter;
} int main()
{
vector<string> list;
listDevices(list);
int capid0 = , capid1 = ;
cout << "dev_size = " << list.size() << endl;
for (int i = ; i<list.size(); i++)
{
if (list[i] == "3D Camera")
capid1 = i;
if (list[i] == "USB2.0 HD UVC WebCam")
capid0 = i;
cout << "device lists:" << list[i] <<'\t'<<"i="<<i<< endl; if (list[i]=="CY3014 USB, Analog 01 Capture")
{
cout<<"video..."<<'\n';
}
}
getchar();
return ;
}

涉及的配置:

opencv的环境不用说自己配置还有两个系统库,需要额外的添加 #pragma comment(lib, “strmiids.lib”) #pragma comment(lib, “quartz.lib”)

note:库存在64位和32位的区别,使用时需要和自己的项目位数相同(以上两个库一般系统都是自带的,不需要额外指定库路径,可以直接引用)

参考博客:

https://blog.csdn.net/wangxiuwen12/article/details/87371359

http://theoractice.github.io/2015/09/18/[Win]%20OpenCV%20管理多摄像头的最简洁方法/

https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=videocapture#reading-and-writing-images-and-video

opencv根据摄像头名称获取索引值的更多相关文章

  1. ResDrawableImgUtil【根据图片名称获取resID值或者Bitmap对象】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 根据图片名称获取项目的res/drawable-xxdhpi中相应资源的ID值以及bitmap值的封装类. 效果图 代码分析 根据图 ...

  2. javascript使用for循环批量注册的事件不能正确获取索引值的解决方法

    今天遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例: <script type="text/jav ...

  3. 关于Shareppoint客户端对象模型和Shareppoint根据内部名称获取字段值的随笔

    实际上,每个SharePoint字段实际上有两个名称,一个是“标题”(Title,有时候也把它叫做“显示名称”),一个是“内部名称”(Internal Name).平时用户在列表视图界面上看到的,都是 ...

  4. foreach获取索引值

    List<" }; foreach (string item in items) { int index = items.IndexOf(item); Console.WriteLin ...

  5. js读取cookie 根据cookie名称获取值、赋值

    借鉴:原作者https://blog.csdn.net/zouxuhang/article/details/80548417   //方法1   //存在问题:如果cookie中存在 aaaname= ...

  6. js读取cookie 根据cookie名称获取值的方法

    //方法1 //存在问题:如果cookie中存在 aaaname=aa;name=bb 获取name的值就会出现错误function getCookie(c_name){ if (document.c ...

  7. C#通过属性名称获取(读取)属性值的方法

    之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...

  8. 【转】JavaScript获取节点类型、节点名称和节点值

    DOM节点信息包括节点类型(nodeType).节点名称(nodeName)和节点值(nodeValue). 节点类型 DOM节点中,每个节点都拥有不同的类型.W3C规范中常用的 DOM节点类型有以下 ...

  9. ASP.NET中gridview获取当前行的索引值

    在用GridView控件时,我们经常会碰到获取当前行的索引,通过索引进行许多操作.例如,可以获得当前行某一个控件元素:设置某一元素的值等等.下面结合实例介绍几种获得GridView当前行索引值的方法. ...

随机推荐

  1. VsCode安装Go的相关插件

    今天在学习Go的时候,安装Go的相关插件,显示安装不上,但是右下角也一直会提示让你安装,当然你可以设置成忽略,为了开发效率,我选择了安装.然后出现了问题,一直Failed.在网上看到了很多的文章,不是 ...

  2. 微信小程序的分享功能-css文字超过两行隐藏

    .info{ width:100px; word-break:break-all; display:-webkit-box; -webkit-box-orient:vertical; -webkit- ...

  3. Linux中的MySQL授权远程连接

    Linux中 MySQL 授权远程连接 参考地址:https://www.centos.bz/2018/10/linux%e4%b8%ad-mysql-%e6%8e%88%e6%9d%83%e8%bf ...

  4. ROS常用命令

    ROS常用命令 打印ros环境变量 $ echo $ROS_PACKAGE_PATH 确认环境变量已经设置正确 export | grep ROS 环境变量设置文件 sudo gedit ./.bas ...

  5. C#读写三菱PLC数据 使用TCP/IP 协议

    本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...

  6. IdentityServer4入门三:授权模式

    在入门一.入门二我们实现了一个完整的API保护的过程.需要保护的API只需在其Controler上应用[Authorize]特性,来显式指定受保护的资源.而我们实现的这个例子,所应用的模式叫“Clie ...

  7. final和finally的区别

    final关键字可以用于修饰类,方法,变量.用该关键字修饰类,方法,变量都有不可变的特性. 1)final关键字用于基本数据类型前,就表明该变量就变成了一个常量,在被定义后的赋值不能被修改. 2)fi ...

  8. PHP中定义常量的区别,define() 与 const

      正文 在PHP5.3中,有两种方法可以定义常量: 使用const关键字 使用define()方法 const FOO = 'BAR'; define('FOO','BAR'); 这两种方式的根本区 ...

  9. LoadRunner11下载、安装与破解

    目前LoadRunner最新版本已经更新到LR12了,但是只有试用版本,最多只支持50人的并发,所以我们还是只能用LR11的破解版,毕竟商用 版是真的很贵,一般企业怕是都不会去购买. 1.LoadRu ...

  10. <JavaScript>调用apply报错:CreateListFromArrayLike called on non-object;

    Function.apply(obj, args)方法能接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(args--> ...