Python OpenCV调用笔记本摄像头报错及CAP_DSHOW解决方案
本文针对Python使用OpenCV调用笔记本摄像头时出现的视频窗口闪退及mediaType设置失败报错,提供详细排查与解决方法。通过分析错误日志中关于MFVideoFormat_RGB24的提示,指出默认API在部分Windows环境下存在兼容性问题。核心解决方案是在cv.VideoCapture初始化时显式指定cv.CAP_DSHOW参数,从而绕过Media Foundation框架的限制,确保视频流正常读取。
使用OpenCV打开笔记本电脑摄像头报错
近期需要完成一个下位机向上传输图像数据的任务。在调试阶段,我编写了一个客户端程序,用于获取笔记本电脑摄像头的视频数据并发送给服务器,随后由服务器端展示视频画面。然而在实际运行客户端时遇到了报错,导致视频窗口出现闪退现象。
通常情况下,获取摄像头图像数据的代码编写方式如下:
capture = cv.VideoCapture(0)但在执行上述代码时,系统会抛出如下错误信息:
[ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-52oirelq\opencv\modules\videoio\src\cap_msmf.cpp (677) CvCapture_MSMF::initStream Failed to set mediaType (stream 0, (640x480 @ 30) MFVideoFormat_RGB24(codec not found)
经过网络搜索与排查,发现只需对原有代码进行细微调整即可解决该问题。
# 建立图像读取对象
capture = cv.VideoCapture(0,cv.CAP_DSHOW) #更改API设置代码中的参数0代表调用笔记本电脑自带的内置摄像头。如果设备连接了外接摄像头,用户可以根据实际情况选择1、2等对应的设备索引号。
OpenCV打开摄像头报错问题
CvCapture_MSMF::initStream Failed to set mediaType (stream 0, (640x480 @ 30)
cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)enum VideoCaptureAPIs {
CAP_ANY = 0, //!< Auto detect == 0
CAP_VFW = 200, //!< Video For Windows (obsolete, removed)
CAP_V4L = 200, //!< V4L/V4L2 capturing support
CAP_V4L2 = CAP_V4L, //!< Same as CAP_V4L
CAP_FIREWIRE = 300, //!< IEEE 1394 drivers
CAP_FIREWARE = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE
CAP_IEEE1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE
CAP_DC1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE
CAP_CMU1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE
CAP_QT = 500, //!< QuickTime (obsolete, removed)
CAP_UNICAP = 600, //!< Unicap drivers (obsolete, removed)
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, //!< RealSense (former Intel Perceptual Computing SDK)
CAP_REALSENSE = 1500, //!< Synonym for CAP_INTELPERC
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)
};附上查看可用摄像头索引号的方法:
import cv2
ID = 0
while(1):
cap = cv2.VideoCapture(ID,cv2.CAP_DSHOW)
# get a frame
ret, frame = cap.read()
if ret == False:
ID += 1
else:
print(ID)
break以上为个人调试经验总结,希望能为大家提供有价值的参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









