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:[email protected]] 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:[email protected]] 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()
我们在初始化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()
屏幕窗口中将显示灰度处理后的摄像头实时视频。