赞
踩
Ubuntu 18.04 aarch64
Python 3.7.15
opencv-python 4.6.0
插入USB摄像头后,/dev/video0会正常出现,使用fswebcam也能正常拍摄照片。但运行opencv-python的视频拍摄例程时出错,例程如下。
如果例程正确运行,屏幕窗口中将显示灰度处理后的摄像头实时视频。
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) if not cap.isOpened(): print("Cannot open camera") exit() while True: # Capture frame-by-frame ret, frame = cap.read() # if frame is read correctly ret is True if not ret: print("Can't receive frame (stream end?). Exiting ...") break # Our operations on the frame come here gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # Display the resulting frame cv.imshow('frame', gray) if cv.waitKey(1) == ord('q'): break # When everything done, release the capture cap.release() cv.destroyAllWindows()
报错信息如下
[ WARN:0@10.618] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.
Can't receive frame (stream end?). Exiting ...
单步调试后,发现出错语句在于
ret, frame = cap.read()
执行该语句后,终端会出现警告信息[ WARN:0@10.618] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.;并且语句的返回值ret为False,代表执行失败。
见招拆招,接下来谷歌这个警告,有如下收获
https://forum.opencv.org/t/videoio-v4l2-dev-video0-select-timeout/8822/5
Hey, I got simmilar issue and solve it with setting format as MJPG int the 4-character code of codec.
from cv2 import cv2 camera = cv2.VideoCapture(0) camera.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) status, image = camera.read() camera.release()
- 1
- 2
- 3
- 4
- 5
- 6
我们在初始化cap对象后,给它额外设置属性”MJPG int 编解码器的 4 字符代码”,即可解决该问题。原理尚不清楚,先记录下过程。
修改后的例程如下
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G')) if not cap.isOpened(): print("Cannot open camera") exit() while True: # Capture frame-by-frame ret, frame = cap.read() # if frame is read correctly ret is True if not ret: print("Can't receive frame (stream end?). Exiting ...") break # Our operations on the frame come here gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # Display the resulting frame cv.imshow('frame', gray) if cv.waitKey(1) == ord('q'): break # When everything done, release the capture cap.release() cv.destroyAllWindows()
此时,屏幕窗口中应当正确显示灰度处理后的摄像头实时视频。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。