我们使用Opencv打开摄像头,一般是使用VideoCapture的open接口。

CV_WRAP virtual bool open(int index);

open接口要传入一个标识符,如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。

系统:

银河麒麟linux系统

问题:

现在我插入了一个双目摄像头(两个USB线,一个彩色,一个红外),那我就想打开彩色的,怎么办呢?每次我插入USB线,系统都会默认给设备分配一个video路径,例如 /dev/video3,根据插入USB线的顺序,每次分配的都不一样,这样通过open就不能指定打开哪一个。

解决思路:

每个设备都有自己的pid和vid,我要通过pid和vid找到特定的/dev/video,例如我获取到了路径 /dev/video3,那么取最后的数字3,通过open(3),即可打开指定的摄像头。需要使用libudev。

下面的函数是通过遍历所有的视频设备,再用摄像头的pid和vid与其对比,最后得到摄像头的路径。(这里注意麒麟linux和UOS系统,打开的序号可能会相差1,所以UOS系统需要可能要再-1)

int findCameraVideoPath(char *pid, char *vid, char *dpath)
{struct udev *udev = NULL;struct udev_enumerate *udev_enumerate = NULL;struct udev_list_entry *list_entry = NULL;int count = 0;int flag = 0;char devName[128]={0};udev = udev_new();if(udev == NULL){//tipsreturn 0;}udev_enumerate = udev_enumerate_new(udev);if(udev_enumerate == NULL){//tipsreturn 0;}udev_enumerate_add_match_subsystem(udev_enumerate, "video4linux");udev_enumerate_scan_devices(udev_enumerate);udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(udev_enumerate)){struct udev_device *device;device = udev_device_new_from_syspath(udev_enumerate_get_udev(udev_enumerate), udev_list_entry_get_name(list_entry));if(device!=NULL){//tips);if(udev_device_get_property_value(device, "ID_VENDOR_ID")!=NULL &&udev_device_get_property_value(device, "ID_MODEL_ID")!=NULL &&!strcmp(vid, udev_device_get_property_value(device, "ID_VENDOR_ID")) &&!strcmp(pid, udev_device_get_property_value(device, "ID_MODEL_ID"))){sprintf(devName,"/dev/video%s", udev_device_get_sysnum(device));flag = 1;count++;}udev_device_unref(device);}else{//tips}}if(flag!=0){if(strlen(devName)>0)memcpy(dpath, devName, strlen(devName));}udev_enumerate_unref(udev_enumerate);udev_unref(udev);return flag;
}

下面附上win系统MFC的事例,与上面思路类似:

#include <iostream>
#include <string>
#include <vector>
#include <DShow.h>
#include <CString>
#pragma   comment(lib,"Strmiids.lib")using namespace std;
//输入:pidvid     exp: vid_1234&pid_1234
//输出:ID, 为-1则找不到设备
int getCamIDFromPidVid(char* pidvid)
{int iRet = -1;int iCameraNum = 0;            //设备个数vector<CString> devList;    //设备列表CString str ;ICreateDevEnum *pDevEnum = NULL;IEnumMoniker *pEnum = NULL;HRESULT hr = NULL;CoInitialize(NULL);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;ULONG cFetched;while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK){IPropertyBag* pPropBag;hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,reinterpret_cast<void**>(&pPropBag));  if (SUCCEEDED(hr)){//获取设备路径,路径里包含pidvid的信息VARIANT varName;varName.vt = VT_BSTR;VariantInit(&varName);hr = pPropBag->Read(L"DevicePath", &varName, 0);        //read函数只能够读取CLSID, FriendlyName, DevicePath这三种CString sdev(varName);devList.push_back(sdev);iCameraNum   ++;pPropBag->Release();}pMoniker->Release();}}}//对比,得到idfor(int i = 0;i<devList.size();i++){int index = devList[i].Find(pidvid);if(index != -1){iRet = i;break;}}CoUninitialize();return iRet;
}

通过Opencv打开指定摄像头的方法相关推荐

  1. Python使用opencv打开笔记本摄像头时遇到的问题及解决办法

    Python使用opencv打开笔记本摄像头时遇到的问题及解决办法 最近在学习python,想用opencv做个人脸检测,打开笔记本摄像头时遇到了问题.摄像头总是闪一下就关闭,并提示一行警告([ WA ...

  2. 使用Opencv打开手机摄像头

    使用opencv打开手机摄像头,这里指的是电脑端写的opencv软件读取手机摄像头图像. 其主要原理是在手机端打开一个端口,打开.读取手机摄像头,然后通过ip-端口号实现远程摄像头图像读取,其实就是让 ...

  3. Linux命令模式下打开摄像头,Linux下利用Opencv打开笔记本摄像头问题

    新建test文件夹,文件夹存在test.cpp和CMakeLists.txttest.cpp#include #include #include #include #include #include ...

  4. linux打开笔记本摄像头驱动程序,Linux下利用Opencv打开笔记本摄像头问题

    新建test文件夹,文件夹存在test.cpp和CMakeLists.txttest.cpp#include @H_404_8@ #include #include #include #include ...

  5. UOS使用命令调用文件管理器打开指定路径的方法

    语法如下: dde-file-manager <路径> 例如: dde-file-manager /home/liumou/ 麒麟的方法如下: 麒麟kylin使用命令调用文件管理器打开指定 ...

  6. 使用opencv打开笔记本摄像头

    opencv版本是3.10.0 系统是win7x64位 工具是vs2013 刚开始用网上找的代码发现不能正常打开摄像头要么摄像头灯亮了一下程序就自动结束了,要么就是弹出选择视频源的界面然后点击也没有反 ...

  7. 用 python , opencv 打开网络摄像头读取图像

    打开网络摄像头用如下代码: ########################################### import cv2 url = 'rtsp://admin:password@19 ...

  8. OpenCV 学习笔记(5) 使用opencv打开笔记本摄像头

    #include "stdafx.h" #include <opencv2\opencv.hpp> #include <iostream> #include ...

  9. opencv笔记(二)之opencv打开笔记本摄像头

    一.前言 楼主最近在使用opencv采集摄像头信息,一开始都不知道怎么去打开笔记本的摄像头的,于是有空做一个记录分享 至于win下怎么配置opencv可以参考楼主文章Opencv笔记(一)之vs201 ...

最新文章

  1. pgadmin使用教程
  2. No module named 'xxx’
  3. FragmentTabHost + Fragment 使用小记
  4. 转化百分比_小秘诀教你如何快速提升大众点评访客转化率!
  5. git config设置用户名_hexo和git搭建博客过程
  6. 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
  7. python 高级语言特性_Pytohon学习笔记(一)Python编程语言历史及特性
  8. linux 内核 82540网卡,Linux网卡as4.2 编译安装及配置准备
  9. 算法提高 陶陶摘苹果(java)
  10. pyqt5实现按钮添加背景图片以及背景图片的切换
  11. synchronized锁自旋2
  12. QTextEdit显示中文乱码解决,中文GB2312转Unicode,QString、QByteArray 转换,16进制显示,toUtf8与toLocal8Bit区别
  13. Series的idxmax和argmax
  14. 金旭亮:我是一只IT小小鸟(新书推荐 序)
  15. java jshell_[Java JShell 指南] - 介绍
  16. blender基本翻译+快捷键
  17. 服务器API压力测试 -ab工具
  18. 从一个帝国的消逝,看商业组织的进化
  19. 使用python做协整模型分析并进行残差检验
  20. Position属性值的相关解析

热门文章

  1. python爬取网易云音乐歌曲评论信息
  2. 传感技术复习笔记(7)——压电式传感器
  3. Linux系统漏洞本地提权
  4. java高级程序员(Java高级程序员招聘)
  5. 【网络部署】校园网的网线接入路由器的lan口与接入wan口有何区别,如何设置校园网,接入lan口后如何访问路由器设置页面
  6. 计算机在英语写作中应用,计算机技术在英语写作教学中的应用研究
  7. 来自Apache(mime.types存档)的mime大全
  8. path development介绍
  9. 论爱迪生和特斯拉的直流交流电之争
  10. 开启hadoop之旅的大门–安装配置篇