Как сохранить изображения в памяти и получить к ним доступ в другом приложении без потерь? - PullRequest
0 голосов
/ 21 апреля 2020

Я делаю проект, который состоит из двух частей. сначала я использую process.py, и он читает видео по ссылке rtsp в бесконечном l oop, а затем записывает выходное изображение на сервер в том же l oop. как то так:

import cv2
from threading import Thread


class RTSPVideoWriterObject(object):
    def __init__(self, src=src):
        # Create a VideoCapture object
        self.capture = cv2.VideoCapture(src)
        self.status, self.frame = None, None
        # Start the thread to read frames from the video stream
        self.thread = Thread(target=self.update, args=())
        self.thread.daemon = True
        self.thread.start()

    def update(self):
        # Read the next frame from the stream in a different thread
        while True:
            if self.capture.isOpened():
                (self.status, self.frame) = self.capture.read()

    def save(self):
        while True:
            try:
                # Do some processes
                cv2.imwrite('path/to/folder/image.jpg')

            except AttributeError:
                pass

if __name__ == '__main__':
    src = 'rtsp://some-link'
    video_stream_widget = RTSPVideoWriterObject(rtsp_stream_link)
    video_stream_widget.save()

Работает просто отлично. Следующая часть - это файл server.py, который я запускаю, пока process выполняется и сохраняет изображение, чтобы сделать его доступным для клиентов:

import cv2
from flask import Flask, render_template, Response

app = Flask(__name__)


@app.route('/video_feed')
def index():
    """Video streaming home page."""
    return render_template('index.html')


def gen():

    while True:
        # Capture frame-by-frame
        img = cv2.imread('path/to/server/image.jpg'))
        # ret, img = cap.read()
        # if ret:
        img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
        frame = cv2.imencode('.jpg', img)[1].tobytes()
        yield b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n'
        time.sleep(0.07)
        # else:
        #     break


@app.route('/')
def video_feed():
    """Video streaming route. Put this in the src attribute of an img tag."""
    return Response(gen(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8888, debug=True)

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

Я подумал, что смогу сохраните выходное изображение в process.py в памяти и получите доступ к нему с помощью server.py. или даже если бы я мог использовать библиотеку flask -socketio, я смогу добавить больше функций позже. но у меня не так много опыта работы с библиотеками flask или flask.socketio или bytesio.

Мне было интересно, может ли кто-нибудь помочь мне решить эту проблему более организованным и стандартным способом.

Спасибо

...