Недавно я столкнулся с проблемой, когда функция cv2.VideoCapture.read () зависает при чтении конвейера gstreamer. Кажется, что поток работает некорректно в течение нескольких секунд, затем полностью зависает. После небольшой отладки я обнаружил, что он всегда зависает в строке videocapture.read ().
Строка захвата:
cap_receive = cv2.VideoCapture('udpsrc port=5004 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP4V-ES" ! rtpmp4vdepay ! decodebin ! videoconvert ! appsink', cv2.CAP_GSTREAMER)
while l oop, где я читаю и обрабатываю кадров (было больше обработки изображений, но даже этот простой код все равно «ломается»):
while (cap_receive.isOpened()):
status, frame = cap_receive.read()
if not status:
print('empty frame')
break
timestamp = datetime.datetime.now()
cv2.putText(frame, timestamp.strftime(
"%A %d %B %Y %I:%M:%S%p"), (10, frame.shape[0] - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
(flag, encodedImage) = cv2.imencode(".jpg", frame)
if not flag:
continue
yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' +
bytearray(encodedImage) + b'\r\n')
Это отлично работает при windows P C захвате непосредственно с веб-камеры (cv2.VideoCapture (0) ), но он не работает при попытке захвата из конвейера gstreamer на микроконтроллере под управлением Debian 10.4. Моя версия opencv - 4.1.0
Кто-нибудь еще сталкивался с этой проблемой или знает какие-либо обходные пути? Я также пробовал «захватить» и «извлечь» с теми же результатами.