VIDEOIO ERROR ТОЛЬКО из opencv при потоковой передаче с flask - PullRequest
0 голосов
/ 22 апреля 2020

Я знаю, что это ошибка opencv, и я знаю, что Flask не имеет ничего общего с opencv. Однако, пожалуйста, придерживайтесь меня до конца. Я получаю эту действительно странную ошибку ТОЛЬКО при потоковой передаче кадров CV:

VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
Unable to stop the stream: Device or resource busy

Мой код:

// my camera_detector class does some AI works on the camera frame, other than that nothing special
camera = camera_detector(my_arguments)

@app.route('/')
def index():
    return render_template('index.html')

def gen(camera):
    while True:
        print('getting frame')
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

@app.route('/feed')
def video_feed():
    return Response(gen(camera), mimetype='multipart/x-mixed-replace; boundary=frame')

И вот почему я сказал, что это происходит только с Flask, если я просто возьму кадр камеры следующим образом:

while True:
  frame = camera.get_frame()

без использования flask, все будет работать нормально o_0

Если это имеет какое-то значение, я использую python3 .7 на pi4. Моя камера также выполняет некоторые операции с ИИ на camera_frame, создаваемом open cv, рисовать поля, надписи, перед возвратом кадра в Flask:

def get_frame(self):
  ret, frame = self.camera.read()
  # processing, does AI works, draw boxes and labels
  ret, jpeg = cv2.imencode('.jpg', frame)
  return jpeg.tobytes()

[Редактировать] информацию о камере, если это помогает:

{20-04-22 15:39}raspberrypi:~/detect pi% v4l2-ctl -d /dev/video0 --list-formats
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'YUYV' (YUYV 4:2:2)
        [1]: 'MJPG' (Motion-JPEG, compressed)

[решено]: Ниже приведен ответ для тех, кому это интересно.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Для тех, у кого была такая же проблема, я узнал, что ее вызвало. Проблема заключалась в том, что я создал экземпляр камеры следующим образом:

camera = camera_detector(my_arguments)

, а затем передал это в функцию маршрутизации:

@app.route('/feed')
def video_feed():
    return Response(gen(camera), mimetype='multipart/x-mixed-replace; boundary=frame')

Оказалось, что opencv это не очень понравилось. Я нахожу это очень странным, но оно работает нормально после того, как я изменил его на:

@app.route('/feed')
def video_feed():
    return Response(gen(camera_detector(my_arguments)), mimetype='multipart/x-mixed-replace; boundary=frame')

Любое тело, у которого есть объяснение этому, было бы неплохо!

0 голосов
/ 23 апреля 2020

Похоже, вы заимствуете код у https://blog.miguelgrinberg.com/post/video-streaming-with-flask

Сравнивая их, ваш фрагмент имеет дополнительный \r\n' в конце каждого кадра. Попробуйте удалить это.

...