Python Flask Веб-сервис с OpenCV и веб-камерой - PullRequest
0 голосов
/ 19 июня 2020

У меня есть Raspberry Pi с Flask сервером, который использует OpenCV для потоковой передачи моей USB-веб-камеры на flask веб-сайт.

Один пользователь может подключиться к серверу flask и видеопотоку, но 2 пользователя косяк. Проблема в том, что каждый раз, когда пользователь подключается к серверу, мой скрипт camera.py запускается и использует веб-камеру. Но когда веб-камера уже занята, сценарий camera.py не может использовать веб-камеру, и сценарий дает сбой.

Это означает, что подключены 2 пользователя. Работают 2 скрипта camera.py, и только один может использовать веб-камеру.

Server.py

# main.py
from flask import Flask, render_template, Response
from camera import VideoCamera
app = Flask(__name__)

@app.route('/')
def index():
    # rendering webpage
    return render_template('test.html')

def gen(camera):
    while True:
        #get camera 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('/video_feed')
def video_feed():
    return Response(gen(VideoCamera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

def getbytes(camera):
        for x in range(10):
                frame = camera.get_frame()
                yield (frame)

@app.route('/getvideo')
def generate_video():
        return Response(getbytes(VideoCamera()), mimetype="text/plain")

if __name__ == '__main__':
    # defining server ip address and port
    app.run(host='0.0.0.0',port='5000', debug=True)

Camera.py

#camera.py
# import the necessary packages
import cv2, urllib2, urllib
# defining face detector
face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
ds_factor=0.6
class VideoCamera(object):
    def __init__(self):
       #capturing video
       self.video = cv2.VideoCapture(0)

    def __del__(self):
        #releasing camera
        self.video.release()
    def get_frame(self):
       #extracting frames
        ret, frame = self.video.read()
        frame = cv2.resize(frame,None,fx=ds_factor,fy=ds_factor,
        interpolation = cv2.INTER_AREA)
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        face_rects = face_cascade.detectMultiScale(gray,1.3,5)
        for (x,y,w,h) in face_rects:
         cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
         break
        # encode OpenCV raw frame to jpg and displaying it
        ret, jpeg = cv2.imencode('.jpg', frame)
        return jpeg.tobytes()

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

1 Ответ

1 голос
/ 19 июня 2020

Вы можете использовать функцию isOpened (), чтобы проверить, открыта ли камера или нет, и обработать, открыта ли она, или вы можете открыть несколько камер, как это

например:

cap0 = cv2.VideoCapture(0)
cap0.set(3,160)
cap0.set(4,120)
cap1 = cv2.VideoCapture(1)
cap1.set(3,160)
cap1.set(4,120)

Надеюсь, это будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...