将值传递给另一个在Python Flask中参数化另一个类的类

时间:2017-11-03 00:50:00

标签: python opencv flask python-multithreading

看看这段代码,这是app.py

#!/usr/bin/env python
from importlib import import_module
import os
from flask import Flask, render_template, Response


if os.environ.get('CAMERA'):
    Camera = import_module('camera_' + os.environ['CAMERA']).Camera
else:
    from camera import Camera

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


def gen(camera):
    while True:
        frame = camera.get_frame()
        yield (b'--frame\r\n'
           b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')


@app.route('/video_feed')
def video_feed():
    return Response(gen(Camera()),
            mimetype='multipart/x-mixed-replace; boundary=frame')


if __name__ == '__main__':
    app.run(host='0.0.0.0', threaded=True)

我想要做的是将一个变量传递给camera_opencv.py中的frames()函数,所以我做的是在视频源中实例化一个对象:

@app.route('/video_feed')
def video_feed():
    id = 10
    Obj = frames(id)
    return Response(gen(Camera()),
            mimetype='multipart/x-mixed-replace; boundary=frame')

这是我的camera_opencv.py代码:

import cv2
from base_camera import BaseCamera


class Camera(BaseCamera):
    video_source = 0

    @staticmethod
    def set_video_source(source):
        Camera.video_source = source

    @staticmethod
    def frames():
        camera = cv2.VideoCapture(Camera.video_source)
        if not camera.isOpened():
            raise RuntimeError('Could not start camera.')

        while True:
            _, img = camera.read()
            yield cv2.imencode('.jpg', img)[1].tobytes()

我访问变量的方法是:

class Camera(BaseCamera):
    video_source = 0

    @staticmethod
    def set_video_source(source):
        Camera.video_source = source

    @staticmethod
    def frames(id):
        print(id)

但我无法访问该值?我收到了一个错误。正如我所观察到的,这个Camera类调用了BaseCamera类。这是basecamera类看起来像:

link to basecamera

我应该将变量直接传递给frames函数还是先将它传递给BaseClass类?怎么样??请帮忙。感谢

1 个答案:

答案 0 :(得分:0)

您需要匹配基类签名,因此无法通过重载frame方法传递变量。

您可以做的是创建一个类级属性,并在Camera Class的frames方法中使用它。像这样:

class BaseCamera(object):
    @staticmethod
    def frames():
        """"Generator that returns frames from the camera."""
        raise RuntimeError('Must be implemented by subclasses.')


class Camera(BaseCamera):
    id=None

    @staticmethod
    def frames():
        print Camera.id

Camera.id=10
Camera.frames()