当使用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错误。的主要内容,如果未能解决你的问题,请参考以下文章
将 pi 的 opencv 视频传输到 ffmpeg 以进行 Youtube 流式传输