Закрытие предыдущего экземпляра камеры Pi - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть приложение Flask с запущенным скриптом распознавания лиц и потоковым выводом. Если я загружаю приложение в браузере, оно работает нормально и показывает видео с пи. Если перезагрузить веб-страницу, потоковая передача завершается неудачно и выдается ошибка:

picamera.ex c .PiCameraAlreadyRecording: камера уже использует порт 0

Если я перезагружаю сервер apache2, на котором запущено приложение Flask, все работает нормально. Здесь есть ли способ остановить предыдущий экземпляр / процесс камеры?

Я пробовал так много колобков, используя camera.stop_recording() и camera.close(), но не повезло.

facedetection.py:

#!/usr/bin/python3.5
from flask import Blueprint, render_template, Response
videoStreamBp = Blueprint('videoStream', __name__)

from picamera.array import PiRGBArray
from picamera import PiCamera
import time
from time import gmtime, strftime
import cv2

camera = PiCamera()
camera.resolution = (480, 320)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(480, 320))
time.sleep(1)

face_cascade = cv2.CascadeClassifier('/var/www/haarcascade_frontalface_alt.xml')

def gen():
    for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
        image = frame.array
        gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.1, 5)
        print ("Found "+str(len(faces))+" face(s)")

        for (x,y,w,h) in faces:
            cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)
        #Save the result image
        img_name = "opencv_frame_{}.jpg".format(time)
        img = image.copy()
        (flag, encodedImage) = cv2.imencode(".jpg", img)
        yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + bytearray(encodedImage) + b'\r\n')
        rawCapture.truncate(0)

@videoStreamBp.route('/videoStream')
def getVideo():
    return Response(gen(),
                        mimetype='multipart/x-mixed-replace; boundary=frame')

/videoStream маршрут зарегистрирован в index.py

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете проверить, работает ли уже что-то на вашем порту, с помощью кода:

a_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
location = ("127.0.0.1", 0)
bool = a_socket.connect_ex(location)
if bool == 0:
    #Code for new camera
...