当使用flask进行流式传输时,只有opencv的VIDEO错误。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当使用flask进行流式传输时,只有opencv的VIDEO错误。相关的知识,希望对你有一定的参考价值。

我知道这是一个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

如果这有什么不同的话,我在pi4上使用python3.7。我的相机也会在打开cv产生的camera_frame上做一些AI工作,画框、标签,然后再把帧返回给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:39raspberrypi:~/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)

[已解决]: 答案在下面,有兴趣的朋友可以看看。

答案

对于那些谁得到了有同样的问题,我发现了什么是导致它。问题是我创建了一个摄像机实例,就像这样,然后把它传到我的路由函数中。

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')

谁能解释一下这个问题就好了!

另一答案

看起来你好像是在借用 https:/blog.miguelgrinberg.compostvideo-streaming-with-flask.

比较两者,你的片段多了一个 \r\n' 在每一帧的最后。试着把它去掉。

以上是关于当使用flask进行流式传输时,只有opencv的VIDEO错误。的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jinja 进行 Flask 模板流式传输

使用 python flask 流式传输时查看进程未停止

OpenCV:将视频流式传输到网页浏览器/HTML页面

将 pi 的 opencv 视频传输到 ffmpeg 以进行 Youtube 流式传输

如何在 Flask Server 上的 Google Pubsub 订阅回调中屈服以进行流式传输

通过 RTSP 流式传输 opencv 视频