opencv根据摄像头名称获取索引值
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根据摄像头名称获取索引值的更多相关文章
- ResDrawableImgUtil【根据图片名称获取resID值或者Bitmap对象】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 根据图片名称获取项目的res/drawable-xxdhpi中相应资源的ID值以及bitmap值的封装类. 效果图 代码分析 根据图 ...
- javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
今天遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例: <script type="text/jav ...
- 关于Shareppoint客户端对象模型和Shareppoint根据内部名称获取字段值的随笔
实际上,每个SharePoint字段实际上有两个名称,一个是“标题”(Title,有时候也把它叫做“显示名称”),一个是“内部名称”(Internal Name).平时用户在列表视图界面上看到的,都是 ...
- foreach获取索引值
List<" }; foreach (string item in items) { int index = items.IndexOf(item); Console.WriteLin ...
- js读取cookie 根据cookie名称获取值、赋值
借鉴:原作者https://blog.csdn.net/zouxuhang/article/details/80548417 //方法1 //存在问题:如果cookie中存在 aaaname= ...
- js读取cookie 根据cookie名称获取值的方法
//方法1 //存在问题:如果cookie中存在 aaaname=aa;name=bb 获取name的值就会出现错误function getCookie(c_name){ if (document.c ...
- C#通过属性名称获取(读取)属性值的方法
之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...
- 【转】JavaScript获取节点类型、节点名称和节点值
DOM节点信息包括节点类型(nodeType).节点名称(nodeName)和节点值(nodeValue). 节点类型 DOM节点中,每个节点都拥有不同的类型.W3C规范中常用的 DOM节点类型有以下 ...
- ASP.NET中gridview获取当前行的索引值
在用GridView控件时,我们经常会碰到获取当前行的索引,通过索引进行许多操作.例如,可以获得当前行某一个控件元素:设置某一元素的值等等.下面结合实例介绍几种获得GridView当前行索引值的方法. ...
随机推荐
- 使用 ServerSocket 建立聊天服务器-2
1. 从serverListener中可以看出,每一个客户端创建新的请求之后,都会把它分配给一个独立的chatsocket ,但是每一个ChatSocket都是相互独立的,他们之间并不能沟通,所以要新 ...
- php利用webuploader实现超大文件分片上传、断点续传
PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...
- grafana+mysql忘记admin密码解决方法
通过mysql修改admin的密码. 我之前注册了一个用户,所以我直接复制lvusyy这个用户的密码即可. update user inner join (select password,salt,r ...
- 计蒜客 UCloud 的安全秘钥 ——(hash)
题目链接:https://nanti.jisuanke.com/t/15769. 题意是求可以变换位置以后相同的子串有多少个,那么做法是只要每个数字的平方和,立方和以及四次方和都相同就可以了. 代码如 ...
- 小程序自定义底部tab
首页wxml的代码: <view class="nav" hover-class="none"> <view class="inde ...
- mybatis xml中是sql语句报错: Error creating document instance. Cause: org.xml.sax.SAXParseException: The
最近项目折腾了老半天,找了资料才知道是这么回事... 因为语句中有一个小于号“<”,在XML中,会被当成一个页面元素来解析,不会处理为mysql的SQL语句的组成部分,修改如下: 1.在xml的 ...
- Windows平台下Java,tomcat安装与环境配置
问题描述:在Windows下面做Java web相关的项目的时候,Java和tomcat是基础,这里记载一下Java环境的配置以及tomcat的安装和配置. 使用工具:Windows.jdk安装包.t ...
- IO操作之BIO、NIO、AIO
一.BIO Blocking IO: 同步阻塞的编程方式. BIO编程方式通常是在JDK1.4版本之前常用的编程方式.编程实现过程为:首先在服务端启动一个ServerSocket来监听网络请求,客户端 ...
- 浅谈TextView Ellipsize效果与Marquee跑马灯无效果问题
说到TextView 效果,相信大家一定熟悉跑马灯. 先来看看 Ellipsize是什么,Ellipsize 从开发技术上翻译为省略效果.故名思议,就是当文本无法显示全部时,用什么效果来显示未显示的部 ...
- python 适合的才是最好的
群里老有人问最新的破解码最新的包,最新的就是最好的吗? 今天说一下这些新手的坑: numpy 最好使用的版本是1.13.3 而非新的1.17.0 pandas最好使用的版本是0.18.0 而非新的0 ...