Проблема Python с захватом колбы и opencv

#python #opencv #flask

Вопрос:

Я хочу получить сигнал с веб-камеры или камеры csi на моем jetson nano, отобразить его в веб-браузере и нажать несколько кнопок, чтобы сделать снимок, и в зависимости от кнопки разместить изображение в разных папках.

Я сделал следующий код, который, кажется, работает, но после нескольких действий с кнопками браузер начинает загружаться бесконечно. Через некоторое время веб-браузер не загружается бесконечно. Он загружается до тех пор, пока я не нажму одну из кнопок. И в этом случае я больше не могу видеть прямой сигнал с камеры, я просто вижу снимок, сделанный, когда я нажал кнопку.

 from flask import Flask, render_template, Response, request import cv2 import datetime, time import os, sys import numpy as np from threading import Thread   global rec_frame, Polluted, Clear, Treated, OutOfService  Polluted=0 Clear=0 Treated=0 OutOfService=0   #instatiate flask app  app = Flask(__name__, template_folder='./templates')  #select webcam or CSI #camera = cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)960,format=(string)NV12, framerate=(fraction)20/1 ! nvvidconv flip-method=0 ! video/x-raw,format=(string)BGRx ! videoconvert ! video/x-raw,width=(int)1280, height=(int)960, format=(string)BGR ! appsink" #, cv2.CAP_GSTREAMER) camera = cv2.VideoCapture(1)  def snapshot(frame,folder):  cropped = frame[100:400,200:500]  resized = cv2.resize(cropped,(100,100))  cv2.imwrite("/home/ava/Documents/AVA/Get pictures/"   folder   "/frame-"   time.strftime("%d-%m-%Y-%H-%M-%S")   ".jpg",cv2.cvtColor(resized,cv2.COLOR_RGB2BGR))    def gen_frames(): # generate frame by frame from camera  global rec_frame,Polluted,Clear,Treated,OutOfService    while True:  success,frame = camera.read()   if success:  #get snapshot if button pressed  if(Polluted):   snapshot(frame,"Polluted Water")  Polluted = 0   if(Clear):  snapshot(frame,"Cleared Water")  Clear = 0  if(Treated):  snapshot(frame,"Treated Water")  Treated = 0   if(OutOfService):  snapshot(frame,"Out of Service")  OutOfService = 0      try:  ret, buffer = cv2.imencode('.jpg', cv2.flip(frame,1))  frame = buffer.tobytes()  yield (b'--framern'  b'Content-Type: image/jpegrnrn'   frame   b'rn')  except Exception as e:  print('pass')  pass    else:  pass    @app.route('/') def index():  return render_template('index.html')  @app.route('/video_feed') def video_feed():  return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')  @app.route('/requests',methods=['POST','GET']) def tasks():  global switch,camera  if request.method == 'POST':  if request.form.get('Polluted') == 'Polluted':  global Polluted,rec_frame  Polluted=1  print('in polluted')  elif request.form.get('Clear') == 'Clear':  global Clear  Clear = 1  elif request.form.get('Treated') == 'Treated':  global Treated  Treated = 1  elif request.form.get('OutOfService') == 'OutOfService':  global OutOfService  OutOfService = 1     elif request.method=='GET':  return render_template('index.html')  return render_template('index.html')  if __name__ == '__main__':  app.run()  camera.release() cv2.destroyAllWindows()   

Комментарии:

1. Что показывает консоль, в которой запускается скрипт, какие-либо ошибки?

2. Ничего, никакой ошибки. Я попытался добавить печать флага («флаг») в функцию gen_frame (). Во время нормальной работы я вижу много «флагов» в консоли, когда появляется проблема, я вижу «флаг» только один раз каждый раз, когда нажимаю кнопку. Похоже, что бесконечный цикл «пока верно» больше не работает.

3. какая еще информация вам нужна?