为什么我不能使用OPENCV VideoCapture从前置平板电脑相机中读取视频流?

时间:2018-12-04 23:27:50

标签: python linux opencv video4linux

为了在项目实施过程中尽量减少问题,我选择在Oracle VM Virtual Box上使用基于Docker的Debian。在这种特定情况下,Virtual Box是通过Windows 8进行的。

我要通过OpenCV访问的网络摄像机是DELL在Venue 11 Pro Tablet上提供的OmniVision OV2722

我正在使用此资源的路径如下:

  • 打开Debian虚拟机后,我会在devices > webcams菜单上检查网络摄像头。
  • 启动带有--device=/dev/video0:/dev/video0标志的Docker容器来解析网络摄像头。
  • 在容器中运行我的脚本。

结果:

  • VideoCapture构造函数不返回NULL指针。
  • cap.isOpened()检查方法时,相机已打开
  • 当尝试使用cap.read()获取下一帧时,脚本返回select timeout
  • select timeout之后,显示以下错误:
  

OpenCV错误:断言失败(buf.data && buuf.idContinuos())   imdecode_,文件   /riit/icv-tmp/opencv-2.4.11/modules/highui/src/loadsave.cpp,第307行

     

回溯(最近一次通话最后一次):文件“ main.py,第285行,在    ret,frame = cap.read()cv2。错误:   /root/ocv-tmp/opencv-2.4.11/modules/hihgui/src/loadsave.coo:307:   错误:(-215)函数代码中的buf.data && buf.isContinuos()_

到目前为止我已经尝试过的事情:

  • 使用cv2.VideoCapture.set()方法调整图片大小:获得HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP
  • 从docker linux主机和docker linux容器中删除并插入内核模块UVCVIDEO,并设置--nodrop=1--timeout=10000标志。
  • 使用USB摄像头(Logitech C920)运行相同的脚本:已成功!
  • cap = cv2.VideoCapture()上已经尝试过使用-1、0、1、2、3索引:只有-1和0使我进入了根本错误。 1、2和3在执行时导致致命错误。
  • 试图运行具有管理员权限的虚拟框。

更多信息:

主机:Window 8.1 Pro,2GB,Intel Atom Z3775 来宾:Debian 9,1GB DOCKER图片:bamos/openface

我在这里使用的代码是非常标准的,顺便说一句,它是基于OpenCV文档的。

 cap = cv2.VideoCapture(0)
 if cap is not None and not cap.isOpened():
    print 'Found issues on open the camera'
    exit()

 ret, frame = cap.read()

好吧,我不知道我是否足够具体。请让我知道是否需要更多信息。预先感谢任何对此的支持。

更新:

如@MarianD所述,正确的if语句为if cap is None and not cap.isOpened():

在我已经完成的事情上,我刚刚完成了Windows平板电脑上的网络摄像头驱动程序更新。

2 个答案:

答案 0 :(得分:0)

代替

if cap is not None and not cap.isOpened():

使用

if cap is None or not cap.isOpened():

答案 1 :(得分:0)

问题是我当时使用的机器。