页面上的 Python (Flask) 刷新给 OpenCv 相机对象带来了问题

我有带有 Flask 框架的 python 应用程序。我在我的索引页面上显示来自摄像头的视频流,如下所示:

  <img id="bg2" src="{{ url_for('video') }}" width="400px" height="400px">

一切正常,但如果我直接刷新页面,奇怪的事情就会开始发生。如果我转到另一个页面并返回索引,一切也都有效。这些是我得到的错误(每次都是其中之一):

对象 0x7fc579e00240 错误:未分配正在释放的指针

断言 fctx->async_lock 在 libavcodec/pthread_frame.c:155 失败

要么

分段错误 11

这是数据来自的端点:

@app.route('/video')

def video():

    return Response(video_stream(),

                    mimetype='multipart/x-mixed-replace; boundary=frame')


def video_stream():

    global video_camera # Line 1 ----------------------


    if video_camera == None: # Line 2 ----------------------

        video_camera = VideoCamera()


    while True:

        frame = video_camera.get_frame()


        if frame != None:

            yield (b'--frame\r\n'

                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

如果我删除注释行,一切正常,但由于新对象的不断初始化,它又慢又重。


这是我的相机对象,如果有帮助的话


class VideoCamera(object):

    def __init__(self):

        self.cap = cv2.VideoCapture(0)


    def __del__(self):

         self.cap.release()


    def get_frame(self):

        ret, frame = self.cap.read()

        print(ret)

        if ret:

            ret, jpeg = cv2.imencode('.jpg', frame)

            return jpeg.tobytes()


拉风的咖菲猫
浏览 258回答 1
1回答

慕运维8079593

好的,所以一种解决方案是不使用全局对象。这是新的 video_stream() 函数:def video_stream():&nbsp; &nbsp; video_camera = VideoCamera();&nbsp; &nbsp; ...另一种可能的解决方案是像这样使用线程锁:def video_stream():&nbsp; &nbsp; global video_camera&nbsp; &nbsp; if video_camera == None:&nbsp; &nbsp; &nbsp; &nbsp; video_camera = VideoCamera()&nbsp; &nbsp; while True:&nbsp; &nbsp; &nbsp; &nbsp; with lock:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frame = video_camera.get_frame()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if frame != None:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; global_frame = frame&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield (b'--frame\r\n'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python