我正在尝试使用带有简单代码的opencv和python使用网络摄像头拍摄视频
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
print('cap.isOpened')
if cap.isOpened():
print ('cap is opened')
while(True):
re,img=cap.read()
cv2.imshow("video output", img)
k = cv2.waitKey(10)&0xFF
if k==27:
break
cap.release()
cv2.destroyAllWindows()
如果我尝试播放现有视频(例如.mp4文件),效果很好。但是当我尝试使用网络摄像头时出现错误
GStreamer-CRITICAL **:gst_element_get_state:断言“ GST_IS_ELEMENT(元素)”失败 cap.isOpened
有关更多信息,我将odroid xu4与ubuntu 16.04结合使用,网络摄像头我使用logitech c170(它在webcamtest中正常工作,并使用guvcview)认为在奶酪和camorama上不起作用。
请对此提供帮助。
答案 0 :(得分:1)
以下解决方法有一定的工作机会:
cap = cv2.VideoCapture(0, cv2.CAP_V4L)
OpenCV 3中增加了选择后端的功能,请参见VideoCapture()
docs。
该解决方法将OpenCV 3.4.4构建的后端切换到 V4L (从默认的GStreamer),并在16.04机器上支持GStreamer。这里的问题代码输出在export OPENCV_VIDEOIO_DEBUG=TRUE
之后:
[ WARN:0] VIDEOIO(cvCreateCameraCapture_V4L(index)): trying ...
[ WARN:0] VIDEOIO(cvCreateCameraCapture_V4L(index)): result=0x20b1470 ...
cap.isOpened
cap is opened
如果无法解决该问题,则可以使用V4L
检查您的OpenCV版本是否支持print(cv2.getBuildInformation())
。这里是我构建的相关部分:
Video I/O:
DC1394: YES (ver 2.2.4)
FFMPEG: YES
avcodec: YES (ver 56.60.100)
avformat: YES (ver 56.40.101)
avutil: YES (ver 54.31.100)
swscale: YES (ver 3.1.101)
avresample: NO
GStreamer:
base: YES (ver 1.8.3)
video: YES (ver 1.8.3)
app: YES (ver 1.8.3)
riff: YES (ver 1.8.3)
pbutils: YES (ver 1.8.3)
libv4l/libv4l2: NO
v4l/v4l2: linux/videodev2.h