opencv获取摄像头的个数及名字
最近需要使用多个摄像头来进行视频分析,有一个问题就是如何获取目前主机上有多少个摄像头。网上看了下,用VideoInput这个开源库的居多,但是还要引入这个库以及一些附加的依赖库,显得较为麻烦。其实在opencv中已经封装了这个库,但是封装的比较厉害,我需要的获取摄像头个数的接口就在里面。最后就只能改源码了。做个笔记,以防下次再次使用。
测试平台:win7(32)+vs2010+opencv2.4.9
使用前提:opencv2.4.9可以正常在vs2010上运行(即原先的配置是正确的)
工程以及编译好的头文件和库的下载地址在文章的末尾。
下面是修改过程:
步骤一:在源文件cap_dshow.cpp中的类CvCaptureCAM_DShow中增加两个函数,分别为:
virtual intreDeviceCount();//返回摄像头为数量
virtual std::string reDeviceName(intdeviceId);//返回摄像头ID对应的名字
class CvCaptureCAM_DShow : public CvCapture
{
public:
<span style="white-space:pre"> </span>CvCaptureCAM_DShow();
<span style="white-space:pre"> </span>virtual ~CvCaptureCAM_DShow();
...
<span style="white-space:pre"> </span>virtual int reDeviceCount();//返回摄像头的数量
<span style="white-space:pre"> </span>virtual std::string reDeviceName(int deviceId);//返回摄像头ID对应的名字
...
};
实现这两个函数:
int CvCaptureCAM_DShow::reDeviceCount()
{int deviceNumber = VI.listDevices(true);return deviceNumber;
}
std::string CvCaptureCAM_DShow::reDeviceName(int deviceId)
{int deviceNumber = VI.listDevices(true);if (deviceId < deviceNumber){char * deviceName = VI.getDeviceName(deviceId);std::string str(deviceName);return str;}else{std::string str("Default Camera");return str;}
}
步骤二:在头文件precomp.hpp中增加两个函数,分别为:
intretrieveDeviceCount_DShow();返回摄像头的数量
std::string retrieveDeviceName_DShow(int deviceId);返回摄像头对应名字。
CvCapture* cvCreateCameraCapture_DShow( int index );
int retrieveDeviceCount_DShow();//增加的函数
std::string retrieveDeviceName_DShow(int deviceId);//增加的函数
CvCapture* cvCreateCameraCapture_MSMF( int index );
CvCapture* cvCreateFileCapture_MSMF (const char* filename);
步骤三:在源文件cap_dshow.cpp的最后实现步骤二中的两个函数,这两个函数分别调用了步骤一中的两个函数。
int retrieveDeviceCount_DShow()
{CvCaptureCAM_DShow* capture = new CvCaptureCAM_DShow;int deviceCount = capture->reDeviceCount();delete capture;return deviceCount;
}
std::string retrieveDeviceName_DShow(int deviceId)
{CvCaptureCAM_DShow* capture = new CvCaptureCAM_DShow;std:: string deviceName = capture->reDeviceName(deviceId);delete capture;return deviceName;
}
步骤四:在源文件cap.cpp中分别增加两个函数并实现。这两个函数分别调用了步骤三中的两个函数。
CV_IMPL int retrieveDeviceCount()
{int deviceCount = retrieveDeviceCount_DShow();return deviceCount;
}CV_IMPL std::string retrieveDeviceName(int deviceId)
{std::string deviceName = retrieveDeviceName_DShow(deviceId);return deviceName;
}
步骤五:在头文件highgui.hpp中的类VideoCapture中增加两个函数,分别为:
CV_WRAP virtual int getDeviceCount();获取摄像头的数量
CV_WRAP virtualstd::string getDeviceName(int deviceId);获取对应摄像头的名字。
class CV_EXPORTS_W VideoCapture
{
public:<span style="white-space:pre"> </span>CV_WRAP VideoCapture();
...<span style="white-space:pre"> </span>CV_WRAP virtual bool open(int device);
<span style="white-space:pre"> </span>CV_WRAP virtual int getDeviceCount();//增加的函数CV_WRAP virtual std::string getDeviceName(int deviceId);//增加的函数
...
};
步骤六:在源文件cap.cpp中实现步骤五中增加的两个函数,这两个函数分别调用了步骤四中的两个函数。
int VideoCapture::getDeviceCount()
{int deviceCount = retrieveDeviceCount();return deviceCount;
}
std::string VideoCapture::getDeviceName(int deviceId)
{std::string deviceName = retrieveDeviceName(deviceId);return deviceName;
}
步骤七:至此,源码修改完毕。
步骤八:在Debug模式下,右键opencv_highgui工程选择Set as StartUp Project,然后右键opencv_highgui工程选择Build,开始构建。构建完成后会生成所需的动态库和静态库。
Release模式下重复此操作,会生成release模式下的动态库和静态库。
步骤九:到源码工程(opencv.sln)所在文件夹中的bin和lib文件夹中的Debug和Release文件夹中拷贝出
opencv_highgui249.dll、
opencv_highgui249d.dll、
opencv_highgui249.lib、
opencv_highgui249d.lib、
opencv_ffmpeg249.dll(没有测试是不是必须的)。
以及..\sources\modules\highgui\include\opencv2\highgui路径下的highgui.hpp(这个就是在步骤五中修改的那个头文件)。
将这六个文件分别替换掉原始配置的文件。
即:将*.dll文件替换掉配置路径..\opencv\build\x86\vc10\bin中重复的文件(替换前先备份)。
将*.lib文件替换掉配置路径..\opencv\build\x86\vc10\lib中重复的文件(替换前先备份)。
将highgui.hpp替换掉路径..\opencv\build\include\opencv2\highgui中重复的文件(替换前先备份)。
步骤十:至此就可以进行测试了。
测试源码:
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
int main()
{cv::VideoCapture cap;int devicenumber = 0;std::vector<std::string> devicename;int deviceCount = cap.getDeviceCount();std::cout<<deviceCount<<std::endl;for (int i=0;i<deviceCount;i++){string deviceName = cap.getDeviceName(i);std::cout<<deviceName<<std::endl;}}
输出结果:(摄像头的名字中文显示会出现乱码,那位有精力的大神在帮忙改一下)
工程及编译好的库和头文件下载地址:就在这里
opencv获取摄像头的个数及名字相关推荐
- opencv获取摄像头帧率分辨率
python opencv 获取摄像头分辨率,设置摄像头分辨率 import cv2cap = cv2.VideoCapture(0)#先设置参数,然后读取参数cap.set(3,1280) # wi ...
- ubuntu18.04 opencv 获取摄像头 (C++/python) 双目摄像头
ubuntu18.04 opencv 获取摄像头 (C++/python) 第一版: // g++ opencv-camera.cpp -o a.out `pkg-config --cflags -- ...
- OpenCV 获取摄像头并显示摄像头视频
OpenCV 获取摄像头,新建窗口显示摄像头视频 结合Leaning OpenCV 第二个例子 显示一个视屏文件 写了一下 获取摄像头的代码为并且创建窗口显示的代码为: #include " ...
- c语言编程获取摄像头图像,OpenCV 获取摄像头图像数据并显示
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. 用摄像头来获取数据的应用其实并不算太多,最近刚刚好用到,查了下用OpenCV来实现非常方便 ...
- python获取摄像头型号,python3.6 opencv获取摄像头代码
注意:运行代码的时候要注意清除缓存 import numpy as np import cv2 cap = cv2.VideoCapture(0) # 从摄像头中取得视频 # 获取视频播放界面长宽 w ...
- 关于opencv获取摄像头数据时报错问题
未定义标识符 "CV_WINDOW_AUTOSIZE"C/C++ 解决办法:在代码开头的头文件中引入 #include <opencv2/highgui/highgui_c. ...
- 2020-10-22OpenCV 获取摄像头并显示摄像头视频
OpenCV 获取摄像头,新建窗口显示摄像头视频 结合Leaning OpenCV 第二个例子 显示一个视屏文件 写了一下 获取摄像头的代码为并且创建窗口显示的代码为: #include " ...
- imx8mini openCV mipi摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device
imx8mini openCV摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device 简单介绍: 首先来看python 源码 然后是openCV ...
- OpenCV打开摄像头(二)
VS2010 + OpenCV2.4.9打开摄像头: 方法一: 参考博文:OpenCV 获取摄像头,新建窗口显示摄像头视频,内含几个函数的介绍~ #include "cv.h" # ...
最新文章
- 基于Debian9.3安装OpenVAS9.0(kali源)
- Taro+react开发(16)--跳转拿参
- python高阶函数、map reduce 自己如何去定义_小猿圈python之高阶函数lambda、map和reduce用法...
- Fibbonacci Number(杭电2070)
- PyTorch 学习笔记(七):PyTorch的十个优化器
- 引用的一个JS组件,JCombo 0.9
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
- Spring Boot项目能之前能正常跑,安装禅道后突然就不行了报错Unknown database “数据库名“
- cad导出pdf_关于PDF文件修改、生成、导图片用这一个软件就够了
- 项目经验:某大厂大数据项目总结
- 局域网 访问计算机 软件,局域网查看工具
- list.php tid= field,DEDE5.7手机移动版实现与PC电脑版静态地址url一致教程(含伪静态规则) | 八戒哥技术博客...
- 程序员的最高境界:呆若木鸡
- 服务器先装系统还是先做热备,安装ibm服务器双机热备操作系统图文详细步骤.doc...
- 微信小程序——简单饮食推荐(一)
- HTML简易奥运五环
- arduino教程-7.脉冲宽度调制【变频】pwm
- 现在开始 -- Steve Pavlina
- 无法验证到服务器的安全证书,打开outlook提示…无法验证的安全证书……
- 批量插入模拟数据入库
热门文章
- 网络测速全解析之一:自定义View基础知识(八)
- 各类ETF跟踪指数的数据统计分析
- C1认证学习一(进制学习)
- 最后一周 | 微生物组-宏基因组分析(线上/线下同时开课,2021.1)
- Win7笔记本如何调整屏幕亮度
- Android平台开发-Android keypad map-Android按键事件
- 亲测方案:解决HBuilder X启动提示语法助手无法访问的问题
- HDU 5804 Price List(水~)
- Pwnginx – a nginx backdoor offering shell
- 2022年全国职业院校技能大赛(高职组)