OpenCV摄像头支持的backend

博客讲述了OpenCV读取摄像头解码问题,windows默认使用MSMF,作者写了DSHOW调用程序解析正常,后发现OpenCV也支持DSHOW,实际上一行代码就能解决问题,且windows一般支持MSMF和DSHOW。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到OpenCV读取摄像头解码有问题的情况(windows默认为MSMF)

参照链接写了一个DSHOW调用的程序发现解析正常(有需要可以留言,但估计没啥用了)

后来想着是不是OpenCV也支持,故而扣了一下OpenCV支持的backend,编译的时候搜索VideoCapture_create可以看到当前平台所支持的backend,发现也是支持的……绕了一大圈,一行代码就能解决的问题…

windows一般支持MSMF和DSHOW

enum VideoCaptureAPIs {
       CAP_ANY          = 0,            //!< Auto detect == 0
       CAP_VFW          = 200,          //!< Video For Windows (platform native)
       CAP_V4L          = 200,          //!< V4L/V4L2 capturing support via libv4l
       CAP_V4L2         = CAP_V4L,      //!< Same as CAP_V4L
       CAP_FIREWIRE     = 300,          //!< IEEE 1394 drivers
       CAP_FIREWARE     = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
       CAP_IEEE1394     = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
       CAP_DC1394       = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
       CAP_CMU1394      = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
       CAP_QT           = 500,          //!< QuickTime
       CAP_UNICAP       = 600,          //!< Unicap drivers
       CAP_DSHOW        = 700,          //!< DirectShow (via videoInput)
       CAP_PVAPI        = 800,          //!< PvAPI, Prosilica GigE SDK
       CAP_OPENNI       = 900,          //!< OpenNI (for Kinect)
       CAP_OPENNI_ASUS  = 910,          //!< OpenNI (for Asus Xtion)
       CAP_ANDROID      = 1000,         //!< Android - not used
       CAP_XIAPI        = 1100,         //!< XIMEA Camera API
       CAP_AVFOUNDATION = 1200,         //!< AVFoundation framework for iOS (OS X Lion will have the same API)
       CAP_GIGANETIX    = 1300,         //!< Smartek Giganetix GigEVisionSDK
       CAP_MSMF         = 1400,         //!< Microsoft Media Foundation (via videoInput)
       CAP_WINRT        = 1410,         //!< Microsoft Windows Runtime using Media Foundation
       CAP_INTELPERC    = 1500,         //!< Intel Perceptual Computing SDK
       CAP_OPENNI2      = 1600,         //!< OpenNI2 (for Kinect)
       CAP_OPENNI2_ASUS = 1610,         //!< OpenNI2 (for Asus Xtion and Occipital Structure sensors)
       CAP_GPHOTO2      = 1700,         //!< gPhoto2 connection
       CAP_GSTREAMER    = 1800,         //!< GStreamer
       CAP_FFMPEG       = 1900,         //!< Open and record video file or stream using the FFMPEG library
       CAP_IMAGES       = 2000,         //!< OpenCV Image Sequence (e.g. img_%02d.jpg)
       CAP_ARAVIS       = 2100,         //!< Aravis SDK
       CAP_OPENCV_MJPEG = 2200,         //!< Built-in OpenCV MotionJPEG codec
       CAP_INTEL_MFX    = 2300,         //!< Intel MediaSDK
       CAP_XINE         = 2400,         //!< XINE engine (Linux)
     };

 

 

要获取 USB 摄像头的名称,可以使用 OpenCV 中的 VideoCapture 类。以下是获取 USB 摄像头名称的示例代码: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { int camera_id = 0; VideoCapture cap(camera_id); if (!cap.isOpened()) { cerr << "ERROR: Unable to open the camera" << endl; return 1; } // Get the camera name string camera_name = ""; cap.set(CAP_PROP_SETTINGS, 1); // Open the camera properties dialog cap.set(CAP_PROP_SETTINGS, 0); // Close the camera properties dialog cap.set(CAP_PROP_SETTINGS, 1); // Open the camera properties dialog cap.set(CAP_PROP_SETTINGS, 0); // Close the camera properties dialog cap.set(CAP_PROP_SETTINGS, 1); // Open the camera properties dialog cap.set(CAP_PROP_SETTINGS, 0); // Close the camera properties dialog cap.set(CAP_PROP_SETTINGS, 1); // Open the camera properties dialog cap.set(CAP_PROP_SETTINGS, 0); // Close the camera properties dialog cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer cap >> Mat(); // Release the camera buffer int prop_id = CAP_PROP_FOURCC; int fourcc = static_cast<int>(cap.get(prop_id)); if (fourcc == static_cast<int>(CAP_FFMPEG)) { prop_id = CAP_PROP_BACKEND; int backend_id = static_cast<int>(cap.get(prop_id)); if (backend_id == static_cast<int>(CAP_BACKEND_V4L2)) { prop_id = CAP_PROP_V4L2_CAPS; string v4l2_caps = cap.get(prop_id); size_t name_start_pos = v4l2_caps.find("card="); if (name_start_pos != string::npos) { name_start_pos += strlen("card="); size_t name_end_pos = v4l2_caps.find(",", name_start_pos); if (name_end_pos != string::npos) { camera_name = v4l2_caps.substr(name_start_pos, name_end_pos - name_start_pos); } else { camera_name = v4l2_caps.substr(name_start_pos); } } } else if (backend_id == static_cast<int>(CAP_BACKEND_MSMF)) { prop_id = CAP_PROP_MSMF_DEVICE_NAME; camera_name = cap.get(prop_id); } else if (backend_id == static_cast<int>(CAP_BACKEND_DSHOW)) { prop_id = CAP_PROP_DSHOW_DEVICE_NAME; camera_name = cap.get(prop_id); } else if (backend_id == static_cast<int>(CAP_BACKEND_AVFOUNDATION)) { prop_id = CAP_PROP_AVFOUNDATION_VIDEO_DEVICE_NAME; camera_name = cap.get(prop_id); } } cout << "Camera Name: " << camera_name << endl; return 0; } ``` 此代码使用 `VideoCapture` 类打开摄像头,并通过 `set` 函数打开和关闭摄像头属性对话框。然后,它检索摄像头的名称并将其打印到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值