Linux下OpenCV打开USB接口的UVC摄像头的方法以及索引号为什么要是202的原因
来源:互联网 发布:r9网络不稳定怎么回事 编辑:程序博客网 时间:2024/05/29 03:02
一般来说,USB的UVC摄像头在LINUX平台下通过V4L驱动来使用。OpenCV打开USB的UVC摄像头一般也通过V4L驱动来打开。打开方法网上都有,一般就是通过VideoCapture的open(int index)函数来打开,其中index设为202。如下:
VideoCapture cap;Mat frame;if(!cap.open(202)) cout<<"camera error!"<<endl;while(1){ cap>>frame;//do what you want here//put your code here}注意这个打开的索引号,只有设置为202才能打开UVC摄像头,设置成其他的往往都无法开UVC摄像头,和windows平台不一样。那么,为什么UVC摄像头的索引需要设为202呢?我们可以看下Opencv的源码,就可以明白。
CV_IMPL CvCapture * cvCreateCameraCapture (int index){ // interpret preferred interface (0 = autodetect) int pref = (index / 100) * 100; // remove pref from index index -= pref; // local variable to memorize the captured device CvCapture *capture = 0; switch (pref) { default: // user specified an API we do not know // bail out to let the user know that it is not available if (pref) break;#ifdef HAVE_MSMF case CV_CAP_MSMF: if (!capture) capture = cvCreateCameraCapture_MSMF(index); if (pref) break;#endif#ifdef HAVE_TYZX case CV_CAP_STEREO: if (!capture) capture = cvCreateCameraCapture_TYZX(index); if (pref) break;#endif case CV_CAP_VFW:#ifdef HAVE_VFW if (!capture) capture = cvCreateCameraCapture_VFW(index);#endif#if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO if (!capture) capture = cvCreateCameraCapture_V4L(index);#endif#ifdef HAVE_GSTREAMER if (!capture) capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, reinterpret_cast<char *>(index)); if (!capture) capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, reinterpret_cast<char *>(index));#endif if (pref) break; // CV_CAP_VFW case CV_CAP_FIREWIRE:#ifdef HAVE_DC1394_2 if (!capture) capture = cvCreateCameraCapture_DC1394_2(index);#endif#ifdef HAVE_DC1394 if (!capture) capture = cvCreateCameraCapture_DC1394(index);#endif#ifdef HAVE_CMU1394 if (!capture) capture = cvCreateCameraCapture_CMU(index);#endif#if defined(HAVE_GSTREAMER) && 0 // Re-enable again when gstreamer 1394 support will land in the backend code if (!capture) capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_1394, 0);#endif if (pref) break; // CV_CAP_FIREWIRE#ifdef HAVE_MIL case CV_CAP_MIL: if (!capture) capture = cvCreateCameraCapture_MIL(index); if (pref) break;#endif#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT) case CV_CAP_QT: if (!capture) capture = cvCreateCameraCapture_QT(index); if (pref) break;#endif#ifdef HAVE_UNICAP case CV_CAP_UNICAP: if (!capture) capture = cvCreateCameraCapture_Unicap(index); if (pref) break;#endif#ifdef HAVE_PVAPI case CV_CAP_PVAPI: if (!capture) capture = cvCreateCameraCapture_PvAPI(index); if (pref) break;#endif#ifdef HAVE_OPENNI case CV_CAP_OPENNI: if (!capture) capture = cvCreateCameraCapture_OpenNI(index); if (pref) break;#endif#ifdef HAVE_OPENNI2 case CV_CAP_OPENNI2: if (!capture) capture = cvCreateCameraCapture_OpenNI2(index); if (pref) break;#endif#ifdef HAVE_XIMEA case CV_CAP_XIAPI: if (!capture) capture = cvCreateCameraCapture_XIMEA(index); if (pref) break;#endif#ifdef HAVE_AVFOUNDATION case CV_CAP_AVFOUNDATION: if (!capture) capture = cvCreateCameraCapture_AVFoundation(index); if (pref) break;#endif#ifdef HAVE_GIGE_API case CV_CAP_GIGANETIX: if (!capture) capture = cvCreateCameraCapture_Giganetix(index); if (pref) break; // CV_CAP_GIGANETIX#endif } return capture;}上面是OPENCV的打开摄像头的中间一层的源码。注意其中开头的代码
int pref = (index / 100) * 100; // remove pref from index index -= pref;可见,pref是索引号中百的倍数,index变为了原index的个位数。而此函数根据pref来选择底层驱动打开摄像头索引号,个位数是最终的摄像头索引号。
然后我们再看
enum{ CV_CAP_ANY =0, // autodetect CV_CAP_MIL =100, // MIL proprietary drivers CV_CAP_VFW =200, // platform native CV_CAP_V4L =200, CV_CAP_V4L2 =200, CV_CAP_FIREWARE =300, // IEEE 1394 drivers CV_CAP_FIREWIRE =300, CV_CAP_IEEE1394 =300, CV_CAP_DC1394 =300, CV_CAP_CMU1394 =300, CV_CAP_STEREO =400, // TYZX proprietary drivers CV_CAP_TYZX =400, CV_TYZX_LEFT =400, CV_TYZX_RIGHT =401, CV_TYZX_COLOR =402, CV_TYZX_Z =403, CV_CAP_QT =500, // QuickTime CV_CAP_UNICAP =600, // Unicap drivers CV_CAP_DSHOW =700, // DirectShow (via videoInput) CV_CAP_MSMF =1400, // Microsoft Media Foundation (via videoInput) CV_CAP_PVAPI =800, // PvAPI, Prosilica GigE SDK CV_CAP_OPENNI =900, // OpenNI (for Kinect) CV_CAP_OPENNI_ASUS =910, // OpenNI (for Asus Xtion) CV_CAP_ANDROID =1000, // Android - not used CV_CAP_ANDROID_BACK =CV_CAP_ANDROID+99, // Android back camera - not used CV_CAP_ANDROID_FRONT =CV_CAP_ANDROID+98, // Android front camera - not used CV_CAP_XIAPI =1100, // XIMEA Camera API CV_CAP_AVFOUNDATION = 1200, // AVFoundation framework for iOS (OS X Lion will have the same API) CV_CAP_GIGANETIX = 1300, // Smartek Giganetix GigEVisionSDK CV_CAP_INTELPERC = 1500, // Intel Perceptual Computing CV_CAP_OPENNI2 = 1600, // OpenNI2 (for Kinect) CV_CAP_GPHOTO2 = 1700, CV_CAP_GSTREAMER = 1800, // GStreamer CV_CAP_FFMPEG = 1900, // FFMPEG CV_CAP_IMAGES = 2000 // OpenCV Image Sequence (e.g. img_%02d.jpg)};CV_CAP_VFW,CV_CAP_V4L,CV_CAP_V4L2都是200。所以,看到下面部分,只有当输入的索引号为200~299时,opencv才会用V4L相关的驱动去打开摄像头。
而在LINUX平台上,USB摄像头的节点一般为/dev/video2。因此索引号一般为2。因此,最终输入OPENCV的索引号应当为202,OpenCV才能正确的打开USB的UVC摄像头。
阅读全文
0 0
- Linux下OpenCV打开USB接口的UVC摄像头的方法以及索引号为什么要是202的原因
- uvc的usb摄像头笔记
- 关于摄像头的UVC协议接口!
- openCV打开摄像头的两个方法
- fedora 14下uvc摄像头灰屏没有图像的问题原因及其解决办法
- linux 下USB 摄像头的使用说明
- linux 下USB 摄像头的使用说明
- UVC支持的摄像头列表
- 基于S3C2440的Linux-3.6.6移植——基于UVC的USB摄像头移植及视频显示
- 基于S3C2440的Linux-3.6.6移植——基于UVC的USB摄像头移植及视频显示
- WINCE下USB接口摄像头驱动的加载
- wince6下usb摄像头(UVC)使用指南
- wince6下usb摄像头(UVC)使用指南
- wince6下usb摄像头(UVC)使用指南
- wince6下usb摄像头(UVC)使用指南
- wince6下usb摄像头(UVC)使用指南
- 【servfox】Arm-linux下USB摄像头的视频服务器的实现
- 求助:关于MAC下的用UVC协议通过USB接口从外接设备接收数据问题
- MAC下MySQL初始密码忘记怎么办
- Executor, ExecutorService 和 Executors 间的不同
- 【git】阿里云上传代码到github附SSH-KEY免密码上传&更新github代码到本地
- C语言rand()与srand()的简单实现
- hadoop1.2.1测试环境搭建
- Linux下OpenCV打开USB接口的UVC摄像头的方法以及索引号为什么要是202的原因
- 118. Pascal's Triangle
- 多线程编程
- vue-自定义指令-拖拽
- Eloquent JavaScript 笔记 十三:DOM
- 学习Linux命令(34)
- 【Unity】简单的事件分发系统
- html的下拉列表框
- python爬虫:抓取页面上的超链接