本文主要是介绍cv.VideoCapture()的摄像头ID究竟是如何编码的?为什么有的是从700开始编码??彻底读懂它!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景
最近在进行开发的时候,针对摄像头ID的问题总是让人恼火至极,有时候直接cv.VideoCapture(0)、cv.VideoCapture(1)就可以调用摄像头,有时候却需要cv.VideoCapture(700)或者cv.VideoCapture(701)才能调用摄像头。这给平台化开发带来了困难。
简述
在使用OpenCV的cv.VideoCapture()函数的时候,后面跟着的的摄像头ID主要是为了指定需要捕获的视频源。
实际上,这个摄像头ID并不是Opencv自己设定的,而是由操作系统和对应的摄像头硬件外设和之间的驱动程序决定的。
摄像头ID的编码规则
摄像头ID的编码规则有如下两种方式,一种是默认ID编码方式,一种的多外设编码方式,一种是非默认方式(700)开始
默认ID
通常为0,如果你的电脑有自己的摄像头,例如前置摄像头,那么直接使用cv.VideoCapture(0),调用的就是你的前置摄像头。
多摄像头编码方式
需要注意的是,对于电脑来说,会有多个外设:鼠标、键盘、摄像头、麦克风……这些外设是由操作系统统一使用设备管理机制来识别,但是并非简单的使用一个外设列表来管理。操作系统在识别外设的时候,流程如下:
- 驱动程序加载
- 设备枚举
- 获取设备名称和标识符
- 根据设备类型,分类设备ID
所以,我们的cv.VideoCapture()的摄像头ID仅仅是摄像头的id,这个id不会包含其他类型的外设。
所以在进行多摄像头的编码的时候,会采用从0开始逐一往后自增1的方式近编码。但是这很明显会导致一个问题:“后面摄像头的ID会被前面摄像头的拔插影响”。例如,对于一个摄像头ID为10的摄像头,前面的0~9摄像头的拔出、异常等都会使得该摄像头的编码发生变化,这对于多摄像头系统的调用和控制很不方便,毕竟一个摄像头出现问题,后面摄像头id直接向前补齐,然后代码又没变……想想都不合理。所以就带来了下面的方式
非默认编码方式(700开始)
为了解决多摄像头编码问题,我们很自然就能想到如下的解决方案:
可以让摄像头从一个id很大的地方开始编码,前面摄像头id无论如何拔插,都不影响该摄像头的调用和控制。那么一个常用的ID就是700,至于为什么选择这个数字,一来是这个数字足够大给默认多摄像头的编码留下足够空间,二来是这个数字又比较好记方便编码,个位十位都是0,很好平台化和编码。
总结
综上,摄像头的编码方式告一段落,希望可以给广大读者带来帮助。有何错漏也请评论让我知晓。
这篇关于cv.VideoCapture()的摄像头ID究竟是如何编码的?为什么有的是从700开始编码??彻底读懂它!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!