Python (Flask)刷新页面时出现OpenCv相机对象的问题

问题描述 投票:0回答:1

我有一个Flask框架的python应用。我在我的索引页上显示来自摄像头的视频流,就像这样。

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

一切都很好,但如果我直接刷新页面,奇怪的事情就会发生。如果我转到另一个页面,然后回到索引页,一切也都能正常工作。

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

断言fctx->async_lock在libavcodecpthread_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()
python opencv flask refresh
1个回答
0
投票

好吧,所以一个解决方案是不使用全局对象。这是新的video_stream()函数。

def video_stream():
    video_camera = VideoCamera();
    ...

另一个可能的解决方案是使用线程锁,像这样。

def video_stream():
    global video_camera
    if video_camera == None:
        video_camera = VideoCamera()

    while True:
        with lock:
            frame = video_camera.get_frame()

            if frame != None:
                global_frame = frame
                yield (b'--frame\r\n'
                       b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
© www.soinside.com 2019 - 2024. All rights reserved.