最近需要使用多个摄像头来进行视频分析,有一个问题就是如何获取目前主机上有多少个摄像头。网上看了下,用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获取摄像头的个数及名字相关推荐

  1. opencv获取摄像头帧率分辨率

    python opencv 获取摄像头分辨率,设置摄像头分辨率 import cv2cap = cv2.VideoCapture(0)#先设置参数,然后读取参数cap.set(3,1280) # wi ...

  2. ubuntu18.04 opencv 获取摄像头 (C++/python) 双目摄像头

    ubuntu18.04 opencv 获取摄像头 (C++/python) 第一版: // g++ opencv-camera.cpp -o a.out `pkg-config --cflags -- ...

  3. OpenCV 获取摄像头并显示摄像头视频

    OpenCV 获取摄像头,新建窗口显示摄像头视频 结合Leaning OpenCV 第二个例子 显示一个视屏文件  写了一下 获取摄像头的代码为并且创建窗口显示的代码为: #include " ...

  4. c语言编程获取摄像头图像,OpenCV 获取摄像头图像数据并显示

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. 用摄像头来获取数据的应用其实并不算太多,最近刚刚好用到,查了下用OpenCV来实现非常方便 ...

  5. python获取摄像头型号,python3.6 opencv获取摄像头代码

    注意:运行代码的时候要注意清除缓存 import numpy as np import cv2 cap = cv2.VideoCapture(0) # 从摄像头中取得视频 # 获取视频播放界面长宽 w ...

  6. 关于opencv获取摄像头数据时报错问题

    未定义标识符 "CV_WINDOW_AUTOSIZE"C/C++ 解决办法:在代码开头的头文件中引入 #include <opencv2/highgui/highgui_c. ...

  7. 2020-10-22OpenCV 获取摄像头并显示摄像头视频

    OpenCV 获取摄像头,新建窗口显示摄像头视频 结合Leaning OpenCV 第二个例子 显示一个视屏文件  写了一下 获取摄像头的代码为并且创建窗口显示的代码为: #include " ...

  8. imx8mini openCV mipi摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device

    imx8mini openCV摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device 简单介绍: 首先来看python 源码 然后是openCV ...

  9. OpenCV打开摄像头(二)

    VS2010 + OpenCV2.4.9打开摄像头: 方法一: 参考博文:OpenCV 获取摄像头,新建窗口显示摄像头视频,内含几个函数的介绍~ #include "cv.h" # ...

最新文章

  1. 基于Debian9.3安装OpenVAS9.0(kali源)
  2. Taro+react开发(16)--跳转拿参
  3. python高阶函数、map reduce 自己如何去定义_小猿圈python之高阶函数lambda、map和reduce用法...
  4. Fibbonacci Number(杭电2070)
  5. PyTorch 学习笔记(七):PyTorch的十个优化器
  6. 引用的一个JS组件,JCombo 0.9
  7. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
  8. Spring Boot项目能之前能正常跑,安装禅道后突然就不行了报错Unknown database “数据库名“
  9. cad导出pdf_关于PDF文件修改、生成、导图片用这一个软件就够了
  10. 项目经验:某大厂大数据项目总结
  11. 局域网 访问计算机 软件,局域网查看工具
  12. list.php tid= field,DEDE5.7手机移动版实现与PC电脑版静态地址url一致教程(含伪静态规则) | 八戒哥技术博客...
  13. 程序员的最高境界:呆若木鸡
  14. 服务器先装系统还是先做热备,安装ibm服务器双机热备操作系统图文详细步骤.doc...
  15. 微信小程序——简单饮食推荐(一)
  16. HTML简易奥运五环
  17. arduino教程-7.脉冲宽度调制【变频】pwm
  18. 现在开始 -- Steve Pavlina
  19. 无法验证到服务器的安全证书,打开outlook提示…无法验证的安全证书……
  20. 批量插入模拟数据入库

热门文章

  1. 网络测速全解析之一:自定义View基础知识(八)
  2. 各类ETF跟踪指数的数据统计分析
  3. C1认证学习一(进制学习)
  4. 最后一周 | 微生物组-宏基因组分析(线上/线下同时开课,2021.1)
  5. Win7笔记本如何调整屏幕亮度
  6. Android平台开发-Android keypad map-Android按键事件
  7. 亲测方案:解决HBuilder X启动提示语法助手无法访问的问题
  8. HDU 5804 Price List(水~)
  9. Pwnginx – a nginx backdoor offering shell
  10. 2022年全国职业院校技能大赛(高职组)