OpenCV VideoCapture.read () зависает при чтении из gstreamer - PullRequest
0 голосов
/ 14 июля 2020

Недавно я столкнулся с проблемой, когда функция 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

Кто-нибудь еще сталкивался с этой проблемой или знает какие-либо обходные пути? Я также пробовал «захватить» и «извлечь» с теми же результатами.

...